2012-09-20 12 views
7

Mam dziwny błąd. Mam kod SQL, który wygląda tak:SUMA() wszystkie wyniki (bez klauzuli grupowej)

SELECT 
    adverse_reaction_type_id, 
    SUM(CASE adverse_reaction_type_id WHEN 1 THEN `number` ELSE 0 END) line, 
    SUM(CASE adverse_reaction_type_id WHEN 2 THEN `number` ELSE 0 END) drug 
FROM 
    core_reports_adverse_reactions, 
    ... 
WHERE 
    ... 

Działa to dobrze na mojej instalacji MAMP, ale nie działa na moim serwerze zdalnym. Zakładam, że jest gdzieś opcja konfiguracji, która powstrzymuje ją przed działaniem.

Jest to błąd Dostaję:

Mieszanie kolumn GROUP (MIN(), MAX(), COUNT(), ...) z żadna grupa kolumn jest nielegalne, jeśli istnieje nie klauzula GROUP bY

wiem co błąd mówi mi, ale problemem jest to, że ja nie chcę do grupy niczym. Chcę uzyskać wszystkie wyniki, gdzie bit gdzie (usunięty powyżej dla zwięzłości) pasuje, a następnie zwraca SUM() z kolumny number (jako line lub drug na podstawie klauzuli CASE).

Więc zasadniczo, niezależnie od tego, co jest dopasowane klauzulą ​​WHERE wszystkim chcę wrócić jest rząd:

line | drug 
----------- 
10 | 32 

Czy istnieje sposób wokół to w ogóle? Albo jakikolwiek sposób mogę GROUP BY nothing czy coś?

+1

Publikowanie jako komentarz, ponieważ jest to tylko częściowa odpowiedź: ten błąd może wystąpić tylko wtedy, gdy włączony jest tryb SQL "ONLY_FULL_GROUP_BY" (patrz [http://dev.mysql.com/doc/refman/5.6/ pl/group-by-hidden-columns.html] (http://dev.mysql.com/doc/refman/5.6/en/group-by-hidden-columns.html)), więc różnica między twoją instalacją MAMP a twój zdalny serwer może być po prostu tym, że nie masz włączonego trybu SQL w instalacji MAMP. – ruakh

Odpowiedz

7

Możesz GROUP BY stałą na stole, gdzie uruchamiasz SELECT.

Na przykład GROUP BY NULL:

mysql> select SUM(CASE WHEN product_id = 0 THEN -1 ELSE product_id END) AS sumprod, SUM(quantity) AS sumquant FROM orders GROUP BY NULL; 
+---------+----------+ 
| sumprod | sumquant | 
+---------+----------+ 
|  4 |  8 | 
+---------+----------+ 
1 row in set (0.00 sec) 

mysql> select version(); 
+-------------+ 
| version() | 
+-------------+ 
| 5.5.25a-log | 
+-------------+ 
1 row in set (0.00 sec) 

Ale zazwyczaj ten błąd oznacza, że ​​istnieje przynajmniej jedna kolumna który jest nie grupowane.

Możliwe, że wersja produkcyjna MySQL jest zaskoczona przez użycie CASE w funkcji agregującej.

+0

ah, rozumiem co masz na myśli, a to sprawia, że ​​błąd ma sens. Właściwie to zmniejszyłem masowe zapytanie SQL, aby uczynić je bardziej czytelnym i usunąłem niektóre "wybrane" kolumny, myśląc, że nie były trafne. Ponownie przeskanowałem pytanie, ale teraz wybrałem to pole "id" z mojego głównego zapytania i działa dobrze! :) dzięki! –

+0

Przyjmuję, kiedy mogę;) –

+0

To nie jest żadna stała. Nie może być liczbą całkowitą. –

Powiązane problemy