sql >> Database teknologi >  >> RDS >> Mysql

Vælg i MySQL hvor alle rækker opfylder en betingelse

Svarene fra @jjclarkson og @davehegr8 er tæt på, men du kan ikke sætte aggregerede funktioner i WHERE-sætningen. WHERE-udtrykket evalueres for hver række.

Du skal evaluere MAX() udtryk for hver gruppe, så du skal bruge en HAVING klausul.

Prøv dette:

SELECT UserID 
FROM ArrivalTimes
GROUP BY UserID
HAVING MAX(ArrivalTime) <= '09:00:00';

@MBCook kommenterer, at HAVING kan være langsom. Du har ret, det er måske ikke den absolut hurtigste måde at producere det ønskede resultat på. Men HAVING løsningen er den mest klare . Der er situationer, hvor ydeevne har lavere prioritet end klarhed og vedligeholdelse.

Jeg så på EXPLAIN-outputtet (på MySQL 5.1.30) for HAVING løsning:ingen indekser blev brugt, og de ekstra bemærkninger sagde "Using temporary; Using filesort ," hvilket normalt betyder, at ydeevnen vil være dårlig.

Overvej følgende forespørgsel:

SELECT DISTINCT a1.UserID
FROM ArrivalTimes a1
  LEFT OUTER JOIN ArrivalTimes a2 
  ON (a1.UserID = a2.UserID AND a2.ArrivalTime > '09:00:00')
WHERE a2.UserID IS NULL;

Dette genererer en optimeringsplan, der bruger et indeks på UserID og siger:

  • a1:"Using index; Using temporary "
  • a2:"Using where; Distinct "

Endelig genererer den følgende forespørgsel en optimeringsplan, der ser ud til at bruge indekser mest effektivt og ingen midlertidige tabeller eller filsortering.

SELECT DISTINCT a1.UserID
FROM ArrivalTimes a1
WHERE NOT EXISTS (SELECT * FROM ArrivalTimes a2 
                  WHERE a1.UserID = a2.UserID 
                    AND a2.ArrivalTime > '09:00:00'); 
  • a1:"Using where; Using index "
  • a2:"Using where "

Dette ser ud til at have den bedste ydeevne. Indrømmet, jeg har kun fire rækker i min testtabel, så dette er ikke en repræsentativ test.



  1. SQLite MELLEM

  2. Jeg droppede general_log-tabellen, hvordan opretter jeg den igen?

  3. Optimalt design til en database med tilbagevendende begivenhed

  4. Begræns PostgreSQL brugeradgang ved hjælp af skema og visninger