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

Jak GROUP BY DESC wybiera swoją kolejność?

SELECT * FROM my_table GROUP BY section_identifier

jest nieprawidłowym SQL zapytanie.

Jak GRUPAJ WG działa?

Przyjmijmy powyższe zapytanie i zobaczmy, jak GROUP BY Pracuje. Najpierw silnik bazy danych wybiera wszystkie wiersze, które pasują do GDZIE klauzula. Nie ma GDZIE klauzula w tym zapytaniu; oznacza to, że wszystkie wiersze tabeli są używane do generowania zestawu wyników.

Następnie grupuje wiersze przy użyciu wyrażeń określonych w GROUP BY klauzula:

+----+--------------------+----------------------+----------+
| id | section_identifier | option_identifier    | store_id |
+----+--------------------+----------------------+----------+
| 17 | header             | header_option_one    |        1 |
| 23 | header             | header_option_three  |        0 |
+----+--------------------+----------------------+----------+
| 18 | footer             | footer_option_one    |        0 |
+----+--------------------+----------------------+----------+
| 19 | homepage_feature   | homepage_feature_one |        0 |
| 25 | homepage_feature   | homepage_feature_one |        1 |
+----+--------------------+----------------------+----------+

Zaznaczyłem grupy na powyższej liście, aby wszystko było jasne.

W następnym kroku z każdej grupy silnik bazy danych tworzy pojedynczy wiersz . Ale jak?

WYBIERZ klauzula zapytania to SELECT * . * oznacza pełną listę kolumn tabeli; w tym przypadku SELECT * to krótki sposób na napisanie:

SELECT id, section_identifier, option_identifier, store_id

Przeanalizujmy wartości kolumny id dla pierwszej grupy. Jaką wartość powinien wybrać silnik bazy danych dla id ? 17 lub 23 ? Dlaczego 17 i dlaczego 23 ?

Nie ma żadnych kryteriów faworyzujących 17 ponad 23 . Po prostu wybiera jeden z nich (prawdopodobnie 17 ale to zależy od wielu czynników wewnętrznych) i idzie jeden.

Nie ma problemu z określeniem wartości dla identyfikator_sekcji . Jest to kolumna używana do GROUP BY , wszystkie jego wartości w grupie są równe.

Dylemat wyboru pojawia się ponownie w kolumnach option_identifier i identyfikator_sklepu .

Zgodnie ze standardowym SQL Twoje zapytanie jest nieprawidłowe i nie może zostać wykonane. Jednak niektóre aparaty baz danych uruchamiają go w sposób opisany powyżej. Wartości dla wyrażeń, które nie są (przynajmniej jedno z poniższych):

  • używane w GROUP BY klauzula;
  • używane z GROUP BY funkcje agregujące w WYBIERZ klauzula;
  • funkcjonalnie zależne od kolumn używanych w GROUP BY klauzula;

są nieokreślone.

Od wersji 5.7.5 , MySQL implementuje funkcjonalne wykrywanie zależności i domyślnie odrzuca nieprawidłową GROUP BY zapytanie takie jak twoje.

Jak sprawić, by to działało

Nie jest dla mnie jasne, w jaki sposób chcesz uzyskać zestaw wyników. W każdym razie, jeśli chcesz pobrać kilka wierszy z tabeli, to GROUP BY nie jest właściwy sposób, aby to zrobić. GRUPA WG nie wybierz wiersze z tabeli, generuje nowe wartości przy użyciu wartości z tabeli. Wiersz wygenerowany przez GROUP BY , w większości przypadków nie pasuje do żadnego wiersza z tabeli źródłowej.

Możesz znaleźć możliwe rozwiązanie swojego problemu w tej odpowiedzi . Będziesz musiał napisać zapytanie samodzielnie po przeczytaniu i zrozumieniu pomysłu (i jest dla Ciebie jasne, jak należy wybrać wiersze „zwycięzcy”).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Awaria usługi XAMPP MySQL po ponownym uruchomieniu

  2. MySQL, Błąd 126:Nieprawidłowy plik klucza dla tabeli

  3. Jak tworzysz strony internetowe w Javie?

  4. Jak przekonwertować kursor SQL Server na odpowiednik MySQL

  5. Czy `mysqlcheck` może pomóc mi rozwiązać problemy z bazą danych bez uszkadzania mojej bazy danych?