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

Uruchamianie wielu zapytań w MySQL bez użycia podzapytania

Nie działa tak, jak uważasz, że powinno, a dokumentacja wyjaśnia znaczenie DISTINCT :chodzi o odrębne wiersze :

(źródło:http://dev.mysql.com /doc/refman/5.7/en/select.html )

Musisz pogrupować wiersze według użytkowników, aby uzyskać jeden wiersz dla każdego użytkownika, ale niestety nie możesz w ten sposób uzyskać ich ostatniego wyniku. Możesz uzyskać maksymalny, minimalny, średni wynik i inne obliczone wartości. Sprawdź listę GROUP BY funkcje agregujące .

Zapytanie

To jest zapytanie, które pobiera potrzebne wartości:

SELECT u.fsname, u.emailaddress, la.score 
FROM users u
INNER JOIN attempts la                # 'la' from 'last attempt'
    ON u.emailaddress = la.emailaddress
LEFT JOIN attempts mr                 # 'mr' from 'more recent' (than last attempt)
    ON la.emailaddress = mr.emailaddress AND la.datetime < mr.datetime
WHERE mr.datetime IS NULL

Jak to działa

Dołącza do tabeli użytkownicy (z aliasem u ) z tabelą próby (alias jako la , skrót od "ostatnia próba") przy użyciu adresu e-mail jako pasująca kolumna. To połączenie, które już masz w zapytaniu, dodałem aliasy, ponieważ od tego momentu pomagają ci pisać mniej.

Następnie dołącza do prób tabela ponownie (alias mr z „nowszych niż ostatnia próba”). Pasuje do każdej próby z la ze wszystkimi próbami mr tego samego użytkownika (identyfikowanego przez jego adres e-mail ) i które mają nowszą datetime . LEWO DOŁĄCZ zapewnia, że ​​każdy wiersz z la pasuje do co najmniej jednego wiersza z mr . Wiersze z la które nie pasują do mr to wiersze, które mają największe wartości datetime dla każdego adresu e-mail . Są one dopasowywane do wierszy pełnych NULL (dla pana część).

Wreszcie GDZIE Klauzula zachowuje tylko te wiersze, które mają NULL w data i godzina kolumna wiersza wybranego z mr . To są wiersze, które pasują do najnowszych wpisów z la dla każdej wartości adres e-mail .

Uwagi dotyczące wydajności

Aby szybko uruchomić to zapytanie (dowolne zapytanie! ) wymaga indeksów w kolumnach używanych w JOIN , GDZIE , GRUPA WG i ZAMÓW PRZEZ klauzule.

Nie powinieneś używać adresu e-mail w tabeli próby do identyfikacji użytkownika. Powinieneś mieć PK (klucz podstawowy) w tabeli users i użyj go jako FK (klucz obcy) w tabeli próby (i inne tabele, które odnoszą się do użytkownika). Jeśli adres e-mail jest PK tabeli użytkowników zmień go na UNIKALNY INDEKS i użyj nowego INTEGER AUTO INCREMENT ed kolumna identyfikator użytkownika jako PK zamiast. Indeksy w kolumnach numerycznych są szybsze i zajmują mniej miejsca niż indeksy w kolumnach z ciągami.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak napisać niestandardową metodę CrudRepository(@Query), aby filtrować wynik w moim przypadku?

  2. Jak podłączyć bazę danych Presto do MySQL

  3. mysql2.so:libmysqlclient_r.so.15:nie można otworzyć udostępnionego pliku obiektu:Brak takiego pliku lub katalogu

  4. Jak dołączyć ma wiele tabel relacji i pobierać wyniki według typu

  5. Problemy z Django i mysql na Mavericks