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 BYklauzula; - używane z
GROUP BY funkcje agregującewWYBIERZklauzula; - funkcjonalnie zależne od kolumn używanych w
GROUP BYklauzula;
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”).