sql >> Database >  >> RDS >> Mysql

MySQL tellen complexe queryresultaten?

Uw probleem is dat uw zoekopdracht niet teruggeeft wat u denkt dat hij retourneert (het helpt altijd om uw zoekopdracht afzonderlijk uit te voeren, om te zien of de resultatenset is wat u verwacht).

Goed, laten we dit opsplitsen.

Je probeert alle berichten te tellen die niet zijn een overeenkomend record in de taxitabel hebben voor die gebruikers-ID. Wat je hier wilt, is JOIN de tabellen en haal die rijen in post dat zou normaal gesproken worden uitgesloten door de join. Dit wordt bereikt door een left outer join

(bewerkt )

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

Dat HAVING clausule zegt:alleen die rijen in de resultatenset die geen overeenkomstige t.taxiID hadden.

Als u deze zoekopdracht uitvoert en de verwachte reeks rijen krijgt (berichten die niet leuk of niet leuk zijn door die gebruiker), DAN kunt u een buitenste zoekopdracht toevoegen om het aantal geretourneerde rijen te tellen:

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

Dit zou een enkele scalaire benoemde telling moeten retourneren. In dit geval kun je zeggen:

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

(2e bewerking ) Deze innerlijke query levert je die berichten op die waarde =1 in de taxitabel hebben, of helemaal geen waarde, wat resulteert in een 4 die voor jouw voorbeeld wordt geretourneerd:

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


  1. Login-script wordt niet uitgevoerd - Bluehost

  2. Hoe u de datumnotatie in uw Oracle-sessie kunt wijzigen

  3. Multi-statement Table Valued Function vs Inline Table Valued Function

  4. NHibernate MappingException:geen persister voor byte[]