Mysql] Count aus Select in Where verwenden

Moritz123

Erfahrenes Mitglied
Hallo allerseits!

ich habe hier ein 1:n-Relation und folgende Abfrage:
Code:
SELECT s.*, (SELECT COUNT(*) FROM USER_SEARCHLISTS c WHERE c.searchlists_id = s.id) as ucount 
FROM SEARCHLIST s
WHERE 1
Diese würde ich gerne um eine WHERE-Bedingung erweitern, die mir alle Datensätze liefert, die keinen Eintrag in users_searchlists enthält.
Eine Erweiterung um
Code:
 WHERE ucount = 0
mündet aber in einen Fehler:
#1054 - Unknown column 'ucount' in 'where clause'

Gibt es eine Möglichkeit diese im WHERE abzufragen?

Vielen Dank!
 
Versuch mal

SQL:
SELECT *  
    FROM SEARCHLIST s
 WHERE NOT EXISTS (SELECT 1 FROM USERS_SEARCHLISTS u WHERE u.searchlists_id  = s.id)
 
Code:
SELECT s.*, a.nCount 
     FROM SEARCHLIST s,
    (SELECT COUNT(*) nCount FROM USER_SEARCHLISTS c,
SEARCHLIST b WHERE c.searchlists_id = b.id)  a
WHERE  a.nCount  = 0;

da fehlt eine verküpfung zwischen s und a. Du bildest da gerade das kartesische Produkt beider Relationen.

Grüße
gore
 
Stimmt :(

man man ohne Tabellen tu ich mir immer so schwer aber er hat eh deine lösung werde meine dann rausnehmen das verwirrt sonst nur
 
Hallo!

vielen Dank für Eure Antworten.
Da sich zwischenzeitlich die Anforderungen etwas geändert haben, gibt es eine zweite Tabelle, die die Relation zwischen User und Searchlist angeben, weswegen ich euer SQL wie folgt modifiziert habe (ohne WHERE):
Code:
SELECT s.*, buyer.bCount,seller.sCount
FROM 
searchlists s,
(SELECT COUNT(*) AS bCount, bs.searchlists_id FROM buyer_searchlists bs, searchlists sl1 WHERE bs.searchlists_id = sl1.id) AS buyer,
(SELECT COUNT(*) AS sCount, ss.searchlists_id FROM seller_searchlists ss, searchlists sl2 WHERE ss.searchlists_id = sl2.id) AS seller

Ich erhalte allerdings folgende Fehlermeldung:
#1048 - Column 'searchlists_id' cannot be null
Kann es sein, dass diese Meldung darauf zurückzuführen ist, das die Tabellen leer sind? Das wäre nicht optimal.
 
Zuletzt bearbeitet:
Code:
SELECT s.*, buyer.bCount,seller.sCount
FROM 
searchlists s,
(SELECT COUNT(*) AS bCount, bs.searchlists_id FROM buyer_searchlists bs, searchlists sl1 WHERE bs.searchlists_id = sl1.id) AS buyer,
(SELECT COUNT(*) AS cCount, ss.searchlists_id FROM seller_searchlists ss, searchlists sl2 WHERE ss.searchlists_id = sl2.id) AS seller


Sollte das nicht heißen seller.cCount anstelle von seller.sCount
 
Ja, sorry - der Beitrag war auch noch gar nicht fertig. :-( Die aktualisierte Version findet sich weiter oben.
 
Code:
SELECT s.*, buyer.bCount,seller.sCount
FROM 
searchlists s,
(SELECT COUNT(*) AS bCount, bs.searchlists_id FROM buyer_searchlists bs, searchlists sl1 WHERE bs.searchlists_id = sl1.id) AS buyer,
(SELECT COUNT(*) AS cCount, ss.searchlists_id FROM seller_searchlists ss, searchlists sl2 WHERE ss.searchlists_id = sl2.id) AS seller

wenn du den COUNT nicht brauchst, kannst Du nach wie vor performant mit EXISTS arbeiten. Es geht doch um COUNT == 0, oder?

SQL:
SELECT s.*, buyer.bCount,seller.sCount
FROM  searchlists s
WHERE NOT EXISTS (SELECT 1  FROM buyer_searchlists bs WHERE bs.searchlists_id = s.id)
AND NOT EXISTS (SELECT 1  FROM seller_searchlists ss WHERE ss.searchlists_id = s.id)

Wenn Du allerdings den COUNT anteil mit benötigst :

SQL:
SELECT s.id, s.weiterefelder, b.count, ss.count
 FROM searchlist s
 LEFT JOIN search buyer_searchlists b ON bs.searchlists_id = s.id
 LEFT JOIN seller_searchlists ss  ON  ss.searchlists_id = s.id
GROUP BY s.id, s.weiterefelder
 
Zuletzt bearbeitet von einem Moderator:
Hallo und danke nochmal.
Wie kann ich bei der LEFT JOIN-Lösung dann aber die Zahlenwerte aus den einzelnen Relationstabellen ermitteln? Ein COUNT(b.*) schlägt fehl?

Letztlich brauche ich sowohl den Count als auch die Möglichkeit die Query mit WHERE zu ergänzen, falls ein entsprechender Filter (Applikationslogik) gesetzt wird.

Vielen lieben Dank!
 
Ups, war eh fehlerhaft.

das hier sollte tun :

SQL:
SELECT s.id, s.weiterefelder, count(b.searchlists_id), count(ss.searchlists_id)
 FROM searchlist s
 LEFT JOIN search buyer_searchlists b ON bs.searchlists_id = s.id
 LEFT JOIN seller_searchlists ss  ON  ss.searchlists_id = s.id
GROUP BY s.id, s.weiterefelder

Wenn es definitiv Daten in einer der Partnerdatenquellen gibt, kannst Du auch INNER JOIN statt LEFT JOIN nehmen. Das ist performanter.
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück