AM używając MySQL 5.7.13 na moim komputerze z systemem Windows z serwerem WAMP
Oto mój problem podczas wykonywania tego zapytania
SELECT *
FROM `tbl_customer_pod_uploads`
WHERE `load_id` = '78' AND
`status` = 'Active'
GROUP BY `proof_type`
Zawsze dostaję taki błąd
Wyrażenie nr 1 z listy SELECT nie znajduje się w klauzuli GROUP BY i zawiera niezagregowaną kolumnę „returntr_prod.tbl_customer_pod_uploads.id”, która nie jest funkcjonalnie zależna od kolumn w klauzuli GROUP BY; jest to niezgodne z sql_mode = only_full_group_by
Czy możesz mi powiedzieć najlepsze rozwiązanie ...
Potrzebuję wyniku takiego jak
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
| id | user_id | load_id | bill_id | latitude | langitude | proof_type | document_type | file_name | is_private | status | createdon | updatedon |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
| 1 | 1 | 78 | 1 | 21.1212 | 21.5454 | 1 | 1 | id_Card.docx | 0 | Active | 2017-01-27 11:30:11 | 2017-01-27 11:30:14 |
+----+---------+---------+---------+----------+-----------+------------+---------------+--------------+------------+--------+---------------------+---------------------+
mysql
group-by
mysql-error-1055
Dhanu K
źródło
źródło
SELECT *
.tbl_customer_pod_uploads
WHEREload_id
= '78' ANDstatus
= 'Active' GROUP BYproof_type
only_full_group_by
tryb SQL.tbl_customer_pod_uploads
WHEREload_id
= '78' ANDstatus
= 'Active' GROUP BYproof_type
Odpowiedzi:
To
zostanie po prostu rozwiązany poprzez zmianę trybu sql w MySQL za pomocą tego polecenia,
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
To też działa dla mnie. Użyłem tego, ponieważ w moim projekcie jest wiele takich zapytań, więc właśnie zmieniłem ten tryb sql na only_full_group_by
Dziękuję Ci... :-)
źródło
Gdy
only_full_group_by
tryb MySQL jest włączony, oznacza to, że podczas używania będą obowiązywały ścisłe reguły ANSI SQLGROUP BY
. W odniesieniu do twojego zapytania oznacza to, że jeśli jesteśGROUP BY
zproof_type
kolumny, możesz wybrać tylko dwie rzeczy:proof_type
lub kolumnaPrzez „agregaty” innych kolumn, to znaczy przy użyciu funkcji takich jak kruszywa
MIN()
,MAX()
lubAVG()
z innej kolumny. Więc w twoim przypadku poprawne byłoby następujące zapytanie:SELECT proof_type, MAX(id) AS max_id, MAX(some_col), MIN(some_other_col) FROM tbl_customer_pod_uploads WHERE load_id = '78' AND status = 'Active' GROUP BY proof_type
Zdecydowana większość
GROUP BY
pytań MySQL, które widzę na SO ma wyłączony tryb ścisły, więc zapytanie jest uruchomione, ale z niepoprawnymi wynikami. W Twoim przypadku zapytanie w ogóle nie zostanie uruchomione, co zmusi Cię do przemyślenia tego, co naprawdę chcesz zrobić.Uwaga: ANSI SQL rozszerza to, co można wybrać,
GROUP BY
włączając także kolumny, które są funkcjonalnie zależne od wybranych kolumn. Przykładem zależności funkcjonalnej byłoby grupowanie według kolumny klucza podstawowego w tabeli. Ponieważ klucz podstawowy jest unikatowy dla każdego rekordu, dlatego też zostanie określona wartość każdej innej kolumny. MySQL jest jedną z baz danych, która na to pozwala (SQL Server i Oracle nie obsługują AFAIK).źródło
GROUP BY
jest prawie zawsze złym pomysłem. Przeraża mnie, że tak wielu użytkowników korzysta z niewłaściwych porad i korzysta z nich.Użyj jednego rozwiązania
(1) PHPMyAdmin
jeśli używasz phpMyAdmina, zmień ustawienie " sql_mode ", jak wspomniano na poniższym zrzucie ekranu.
Edytuj zmienną „tryb sql” i usuń tekst „ONLY_FULL_GROUP_BY” z wartości
(2) SQL / wiersz polecenia Uruchom poniższe polecenie.
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
(3) Nie używaj SELECT *
Użyj odpowiedniej kolumny w zapytaniu SELECT. odpowiednie oznacza kolumny, które są albo w klauzuli „grupuj według”, albo w kolumnie z funkcją agregującą (MAX, MIN, SUMA, COUNT itp.)
Ważna uwaga
Zmiany dokonane za pomocą punktu (1) LUB punktu (2) nie ustawią go NA STAŁE i będą przywracane po każdym restarcie.
Więc powinieneś ustawić to w swoim pliku konfiguracyjnym (np. /Etc/mysql/my.cnf w sekcji [mysqld]), aby zmiany zachowały zastosowanie po restarcie MySQL:
Plik konfiguracyjny: /etc/mysql/my.cnf
Nazwa zmiennej : tryb_sql LUB tryb-sql
źródło
Poniższa metoda rozwiązała mój problem:
W ubuntu
Rodzaj:
sudo vi /etc/mysql/my.cnf
wpisz A, aby przejść do trybu wstawiania
W ostatniej linii wklej poniżej kod dwóch linii:
Wpisz esc, aby wyjść z trybu wprowadzania
Wpisz,
sudo service mysql restart
aby ponownie uruchomić MySQL.źródło
Możesz wyłączyć sql_mode = only_full_group_by za pomocą jakiegoś polecenia, które możesz wypróbować przez terminal lub MySql IDE
mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
źródło
W Ubuntu
Krok 1:
Krok 2: Przejdź do ostatniej linii i dodaj następujące informacje
Krok 3: Zapisz
Krok 4: Zrestartuj serwer mysql.
źródło
Możesz go rozwiązać, zmieniając tryb sql za pomocą tego polecenia:
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
i ... pamiętaj o ponownym połączeniu bazy danych !!!
źródło
przejdź do phpmyadmin, otwórz konsolę i wykonaj to żądanie
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
źródło
Cześć, zamiast brać wszystkie kolumny, po prostu weź to, czego potrzebujesz, używając
ANY_VALUE(column_name)
. Działa doskonale. Po prostu sprawdź.Na przykład:
SELECT proof_type,any_value("customer_name") as customer_name FROM `tbl_customer_pod_uploads` WHERE `load_id` = '78' AND `status` = 'Active' GROUP BY `proof_type`
źródło
Wyszukaj „tryb SQL”, jeśli używasz PhpMyAdmin i zdejmij wartość:,
ONLY_FULL_GROUP_BY
właśnie to zrobiłem i wszystko w porządku.źródło
Wpisz poniżej
Ctrl + O => Y = Ctrl + X
źródło
Z tego, jak to wygląda, myślę, że grupowanie według wielu kolumn / pól nie zaszkodzi wynikowi. Dlaczego nie spróbujesz dodać do grupy w ten sposób:
Wtedy zostanie to zgrupowane jako
proof_type
pierwszeid
. Mam nadzieję, że to nie zmieni wyników. W niektórych / większości przypadków grupowanie według wielu kolumn daje nieprawidłowe wyniki.źródło
To wszystko.
Zrobiłem to w moim Ec2 i zadziałało to czarująco.
źródło
Oto naprawdę szybki i łatwy sposób ustawienia go na stałe
Uwaga: uruchomienie
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
jest tymczasowe i po ponownym uruchomieniu serwera nadal będzie wyświetlany błąd. Aby to naprawić na stałe, wykonaj poniższe czynnościwget https://gist.githubusercontent.com/nfourtythree/90fb8ef5eeafdf478f522720314c60bd/raw/disable-strict-mode.sh
chmod +x disable-strict-mode.sh
./disable-strict-mode.sh
Gotowe, zmiany zostaną wprowadzone w mysql i zostanie ponownie uruchomiony
źródło
Aktualizacja dla MySQL 8.0
Twój
sql-mode
testament nie będzie,NO_AUTO_CREATE_USER
ponieważ został usunięty, jak wspomniano tutaj - jak ustawić tryb sql-w-my-cnf-in-mysql-8Również jeśli ktoś nie ma
my.cnf
pliku, tworzy nowy w,/etc/my.cnf
a następnie dodaje powyższe wiersze.źródło
Miałem podobny problem ze zgniataniem części mojej bazy danych. Zmieniłem parametr w bazie danych za pomocą konsoli bazy danych PHPStorm w następujący sposób:
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
teraz działa jak urok
źródło
W swoim
my.ini
napisz to:zależy od twojej wersji. Lub:
lub po prostu usuń to:
ONLY_FULL_GROUP_BY
źródło
Otwórz panel WAMP i otwórz plik konfiguracyjny MySQL. W nim wyszukaj "sql_mode", jeśli znajdziesz, ustaw go na "", w przeciwnym razie, jeśli go nie znajdziesz, dodaj sql_mode = "" do pliku.
Zrestartuj serwer MySQL i gotowe ...
szczęśliwego kodowania.
źródło