2009-08-19 11 views
6

Mi pregunta es muy similar a éste How to reference a custom field in SQL Tengo la siguiente consulta:El uso de un campo personalizado en la cláusula WHERE de la consulta SQL

SELECT * , (SELECT COUNT(id) 
FROM cms_store_items 
WHERE speaker = cms_store_items_speakers.id 
) AS count 
FROM cms_store_items_speakers 
LIMIT 0 , 30 

tengo que añadir una cláusula WHERE que se parece a WHERE count > 0 pero cuando lo hago Obtengo el error Unknown column 'count' in 'where clause' ¿Hay alguna forma de que haga referencia al campo personalizado en mi cláusula Where sin duplicar la lógica?

Podría simplemente colocar la lógica para la cláusula where en mi código, pero no quiero enviar lo que bien puede ser más de 1000 filas a la aplicación si no es necesario, simplemente parece una pérdida de recursos.

Respuesta

16

Bueno, para hacer esto estrictamente la forma en que lo está haciendo:

select 
* 
from 
(
    SELECT * , (SELECT COUNT(id) 
    FROM cms_store_items 
    WHERE speaker = cms_store_items_speakers.id 
    ) AS count 
    FROM cms_store_items_speakers 
) a 
where a.count > 0 
LIMIT 0 , 30 

Probablemente sería mejor que hacer lo siguiente, sin embargo. Se hace un buen uso de la cláusula de having:

select 
    s.id, 
    s.col1, 
    count(i.speaker) as count 
from 
    cms_store_items_speakers s 
    left join cms_store_items i on 
     s.id = i.speaker 
group by 
    s.id, 
    s.col1 
having 
    count(i.speaker) > 0 
limit 0, 30 
+0

La primera opción funciona muy bien, parece que mi anterior (ahora el comentario eliminado se debió al almacenamiento en caché), gracias por la solución. – UnkwnTech

+0

cambie el recuento (\ *) para contar (i.speaker), y el hecho de contar (\ *) para contar (i.speaker), solo a prueba del futuro del código; si surge la necesidad de contar cero coincidencias, entonces simplemente cambie la unión interna para unirse a la izquierda, votaré su respuesta :) –

+0

@Michael: ¡Buena captura! ¡Gracias! – Eric

0

no estoy 100% seguro de MySQL, pero algo como esto debería ser muy posible:

(SELECT 
    * 
FROM 
(
    SELECT cms_store_items_speakers.*, 
      (SELECT COUNT(id) FROM cms_store_items 
      WHERE speaker = cms_store_items_speakers.id) AS 'count' 
    FROM cms_store_items_speakers) 
    LIMIT 0, 30 
) 
WHERE count > 0; 
+1

Estás limitando demasiado temprano. – Eric

10

Puede utilizar HAVING cláusula en su lugar:

... 
) AS count 
FROM cms_store_items_speakers 
HAVING count > 0 
LIMIT 0 , 30 

HAVING es como WHERE pero es capaz de trabajar en columnas que se calculan. Advertencia:HAVING funciona borrando los resultados después de el resto de la consulta se ha ejecutado; no es un sustituto de la cláusula WHERE.

Cuestiones relacionadas