Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wybierz w MySQL, gdzie wszystkie wiersze spełniają warunek

Odpowiedzi z @jjclarkson i @davethegr8 są bliskie, ale nie możesz umieścić funkcji agregujących w klauzuli WHERE. Klauzula WHERE jest oceniana dla każdego wiersza.

Musisz ocenić MAX() wyrażenie dla każdej grupy, więc musisz użyć HAVING klauzula.

Spróbuj tego:

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

@MBCook komentarze, które HAVING może być powolny. Masz rację, może to nie być absolutnie najszybszy sposób na uzyskanie pożądanego rezultatu. Ale HAVING rozwiązanie jest jasne . Są sytuacje, w których wydajność ma niższy priorytet niż przejrzystość i łatwość konserwacji.

Spojrzałem na wyjście EXPLAIN (w MySQL 5.1.30) dla HAVING rozwiązanie:nie użyto żadnych indeksów, a dodatkowe uwagi mówiły „Using temporary; Using filesort ”, co zwykle oznacza, że ​​wydajność będzie niska.

Rozważ następujące zapytanie:

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;

Spowoduje to wygenerowanie planu optymalizacji, który używa indeksu na UserID i mówi:

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

Na koniec następująca kwerenda generuje plan optymalizacji, który wydaje się najefektywniej wykorzystywać indeksy, bez tabel tymczasowych ani sortowania plików.

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

Wydaje się, że najprawdopodobniej będzie to miało najlepszą wydajność. Muszę przyznać, że w mojej tabeli testowej są tylko cztery wiersze, więc nie jest to test reprezentatywny.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapobieganie wstrzykiwaniu SQL na stronie logowania w PHP

  2. Jak wstawić tablicę wartości do różnych kolumn tabeli mysql?

  3. Kolumna INT(3) nie przycinająca wartości do odpowiedniej długości i pozwalająca na wstawienie pełnej wartości - MySQL

  4. Dziesiętny typ danych zaokrągla wartości

  5. Wstaw do wszystkich komórek, gdy rekordy mają więcej niż jeden PHP