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
wWYBIERZ
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”).