Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL zählt komplexe Abfrageergebnisse?

Ihr Problem ist, dass Ihre Abfrage nicht das zurückgibt, was Sie Ihrer Meinung nach zurückgeben (es hilft immer, Ihre Abfrage eigenständig auszuführen, um zu sehen, ob die Ergebnismenge Ihren Erwartungen entspricht).

Richtig, lassen Sie uns das aufschlüsseln.

Sie versuchen, alle Posts zu zählen, die nicht sind einen übereinstimmenden Datensatz in der Taxitabelle für diese Benutzer-ID haben. Was Sie hier wollen, ist JOIN die Tabellen und holen Sie sich diese Zeilen in post die normalerweise durch den Join ausgeschlossen würden. Dies wird durch einen Left Outer Join

erreicht

(bearbeitet )

SELECT p.ID, t.taxiID
FROM post p LEFT OUTER JOIN taxi t ON p.ID = t.taxiID AND t.userID = '.$user.'
HAVING t.taxiID IS NULL

Dieses HAVING Klausel sagt:nur die Zeilen in der Ergebnismenge, die keine entsprechende t.taxiID hatten.

Wenn Sie diese Abfrage ausführen und den erwarteten Satz von Zeilen erhalten (Beiträge, die von diesem Benutzer nicht mögen oder nicht mögen), DANN können Sie eine äußere Abfrage hinzufügen, um die Anzahl der zurückgegebenen Zeilen zu zählen:

SELECT COUNT(*) as count FROM (
    SELECT p.ID, t.taxiID
    FROM post p LEFT OUTER JOIN taxi t ON p.ID = t.taxiID AND t.userID = '.$user.'
    HAVING t.taxiID IS NULL
) a

Dies sollte einen einzelnen Skalar namens count zurückgeben. In diesem Fall können Sie sagen:

if ($count[0]->count > 10) { blah blah blah }

(2. Bearbeitung ) Diese innere Abfrage liefert Ihnen die Posts, die in der Taxitabelle entweder den Wert =1 oder gar keinen Wert haben, was dazu führt, dass für Ihr Beispiel 4 zurückgegeben wird:

SELECT p.ID, t.taxiID, t.value
FROM post p LEFT OUTER JOIN taxi t ON p.ID = t.taxiID AND t.userID = '.$user.'
HAVING t.taxiID IS NULL OR t.value = 1