2009-08-19 9 views
6

Meine Frage an diesem How to reference a custom field in SQL sehr ähnlich ist, ich die folgende Abfrage haben:ein benutzerdefiniertes Feld Verwendung in WHERE-Klausel der SQL-Abfrage

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 

Ich brauche eine WHERE-Klausel hinzufügen, wie WHERE count > 0 aussieht, aber wenn ich tun Ich bekomme den Fehler Unknown column 'count' in 'where clause' Gibt es sowieso für mich, das benutzerdefinierte Feld in meiner Where-Klausel ohne duplizierende Logik zu referenzieren?

Ich könnte einfach die Logik für die WHERE-Klausel in meinem Code platzieren, aber ich möchte nicht mehr als 1000 Zeilen an die App senden, wenn nicht benötigt, es scheint nur eine Verschwendung von Ressourcen.

Antwort

16

Nun, diese strikt an die Art und Weise tun Sie es tun:

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 

Es wäre wahrscheinlich besser, folgendes zu tun, wenn. Es macht gute Nutzung der having Klausel:

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

Erste Option funktioniert gut, scheint mein früheres (jetzt gelöschter Kommentar wegen Caching), danke für die Lösung. – UnkwnTech

+0

Ändern Sie die Anzahl (\ *) zu zählen (i.speaker), und die Zählung (\ *) zu zählen (i.speaker), nur zukunftssichere den Code; Wenn die Notwendigkeit besteht, Zero Matches zu zählen, dann ändere einfach den inneren Join zum linken Join, ich werde deine Antwort auffrischen :) –

+0

@Michael: Guter Fang! Vielen Dank! – Eric

0

ich mysql nicht 100% sicher bin, aber so etwas wie dies sollte durchaus möglich sein:

(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

Sie begrenzen zu früh. – Eric

10

Sie HAVING Klausel verwendet, kann stattdessen:

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

HAVING ist wie WHERE aber es ist in der Lage, an Spalten zu arbeiten, die berechnet werden. Warnung:HAVING funktioniert durch Beschneidung Ergebnisse nach der Rest der Abfrage ausgeführt wurde - es ist kein Ersatz für die WHERE Klausel.

Verwandte Themen