2009-08-19 17 views
6

Moje pytanie jest bardzo podobny do tego jednego How to reference a custom field in SQL Mam następujące zapytanie:Korzystanie pola niestandardowego w klauzuli WHERE zapytania 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 

muszę dodać klauzuli WHERE, która wygląda jak WHERE count > 0 ale kiedy robię Dostaję komunikat o błędzie Unknown column 'count' in 'where clause', czy mimo to mogę odwołać się do niestandardowego pola w mojej klauzuli where bez powielania logiki?

Mogę po prostu umieścić logikę dla klauzuli where w moim kodzie, ale nie chcę wysyłać tego, co może być więcej niż 1000 wierszy do aplikacji, jeśli nie jest to potrzebne, to po prostu wydaje się marnotrawstwem zasobów.

Odpowiedz

16

Dobrze, aby zrobić to ściśle tak, jak to robią:

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 

Prawdopodobnie byłoby lepiej, aby wykonać następujące czynności, choć. To sprawia, że ​​dobre wykorzystanie having klauzuli:

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

Pierwsza opcja działa świetnie, wygląda na to, że moja wcześniejsza (teraz usunięto komentarz z powodu buforowania), dziękuję za rozwiązanie. – UnkwnTech

+0

zmienić liczbę (\ *) do zliczenia (i.speaker) i licznik (\ *) do liczenia (i.speaker), tylko w przyszłości zabezpieczać kod; jeśli pojawi się potrzeba policzenia zerowych meczów, to po prostu zmień wewnętrzne sprzężenie na lewe połączenie, przekażę ci odpowiedź :) –

+0

@Michael: Dobry haczyk! Dzięki! – Eric

0

nie jestem 100% pewny o mysql, ale coś takiego powinno być bardzo możliwe:

(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

Ograniczasz się zbyt wcześnie. – Eric

10

Można zamiast korzystania HAVING klauzuli:

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

jest jak WHERE, ale jest w stanie pracować na kolumnach, które są obliczane. Ostrzeżenie:HAVING działa przez przycięcie wyników po reszta zapytania została uruchomiona - nie zastępuje klauzuli WHERE.

Powiązane problemy