SQL - błąd składni w zapytaniu zagnieżdżonym

Wszystko o językach skryptowych takich jak PHP i Perl, serwerach WWW, CGI, bazach danych i języku SQL.
shinsessel
Posty: 6
Rejestracja: 26 cze 2015, 22:37:19
Płeć: Niewybrana
User Agent: Opera Windows 1366x768

SQL - błąd składni w zapytaniu zagnieżdżonym

Post autor: shinsessel »

Mój problem jest następujący - chcę znaleźć nicki osób, które były na forum od zadanej daty do teraz, ale weszły nie więcej niż 3 razy.
Kod wygląda następująco:

Kod: Zaznacz cały

SELECT * 
FROM `lista_PHS` AS A
WHERE UPPER(A.NICK_GRACZA) NOT LIKE '%BOT%' 
	AND UPPER(A.NICK_GRACZA) NOT IN ( SELECT UPPER(phpbb_users.username) 
                                   FROM `phpbb_users`, `phpbb_groups`, `phpbb_user_group` 
                                   WHERE phpbb_groups.group_name = 'BRAK GRUPY' 
                                   	AND phpbb_groups.group_id = phpbb_user_group.group_id 
                                   	AND phpbb_user_group.user_id = phpbb_users.user_id ) 
	AND UPPER(A.NICK_GRACZA) LIKE UPPER('%')
	AND COUNT (SELECT B.NICK_GRACZA
               FROM `lista_PHS` AS B
               WHERE UPPER(A.NICK_GRACZA) = UPPER(B.NICK_GRACZA)
               	AND YEAR(B.DATA) >= 2016 
               	AND MONTH(B.DATA) >= 3 
				AND DAY(B.DATA) >= 1) < 3
	AND YEAR(A.DATA) >= 2016 
	AND MONTH(A.DATA) >= 3 
	AND DAY(A.DATA) >= 1 
ORDER BY A.DATA desc, UPPER(A.NICK_GRACZA) asc
LIMIT 0 , 100
Bez warunku COUNT wszystko działa jak powinno, ale gdy staram się go dodać, to otrzymuję błąd składni w linii 10:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT B.NICK_GRACZA FROM `lista_PHS` AS B WHERE' at line 10
Co wpisałem źle, bo nie widzę błędu niestety... ?
Piotr GRD
Posty: 1296
Rejestracja: 25 sty 2010, 11:17:07
Lokalizacja: Szczecin
Płeć: Niewybrana
User Agent: Firefox Windows 1024x768
Kontakt:

SQL - błąd składni w zapytaniu zagnieżdżonym

Post autor: Piotr GRD »

Nie jestem ekspertem odnośnie SQL, nie korzystam osobiście we własnych projektach, rzadko mam z tym styczność, więc i niewiele wiem. Ale tak na mój nos nie pasuje mi kompozycja
SELECT * FROM table WHERE COUNT(*) < 3
i szybkie przeszukanie sieci sugeruje mi, że powinieneś użyć raczej
SELECT * FROM table HAVING COUNT(*) < 3

Czyli w sumie coś na kształt poniższego kodu (choć tu już mogłem namieszać, kieruj się głównie powyższym i w razie konieczności poczytaj więcej o HAVING i używaniu WHERE i HAVING łącznie):

Kod: Zaznacz cały

SELECT *
FROM `lista_PHS` AS A
WHERE UPPER(A.NICK_GRACZA) NOT LIKE '%BOT%'
   AND UPPER(A.NICK_GRACZA) NOT IN ( SELECT UPPER(phpbb_users.username)
                                   FROM `phpbb_users`, `phpbb_groups`, `phpbb_user_group`
                                   WHERE phpbb_groups.group_name = 'BRAK GRUPY'
                                      AND phpbb_groups.group_id = phpbb_user_group.group_id
                                      AND phpbb_user_group.user_id = phpbb_users.user_id )
   AND UPPER(A.NICK_GRACZA) LIKE UPPER('%')
   AND YEAR(A.DATA) >= 2016
   AND MONTH(A.DATA) >= 3
   AND DAY(A.DATA) >= 1
HAVING COUNT (SELECT B.NICK_GRACZA
              FROM `lista_PHS` AS B
              WHERE UPPER(A.NICK_GRACZA) = UPPER(B.NICK_GRACZA)
              AND YEAR(B.DATA) >= 2016
              AND MONTH(B.DATA) >= 3
              AND DAY(B.DATA) >= 1) < 3
ORDER BY A.DATA desc, UPPER(A.NICK_GRACZA) asc
LIMIT 0 , 100
Monitor serwera CBA.pl (zapisz lub dodaj do ulubionych, żeby nie zapomnieć)
------------
Kilka starych, aczkolwiek ciekawych, zdaniem niektórych, zdjęć: http://grd.art.pl/
Jezioro Szmaragdowe w Szczecinie
shinsessel
Posty: 6
Rejestracja: 26 cze 2015, 22:37:19
Płeć: Niewybrana
User Agent: Opera Windows 1366x768

SQL - błąd składni w zapytaniu zagnieżdżonym

Post autor: shinsessel »

Dzięki za pomoc. Podałeś dobre rozwiązanie, jedynie mała uwaga - aby użyć HAVING najpierw trzeba wykorzystać GROUP BY, więc zapytanie znacząco się upraszcza:

Kod: Zaznacz cały

SELECT *
FROM `lista_PHS` AS A
WHERE UPPER(A.NICK_GRACZA) NOT LIKE '%BOT%'
   AND UPPER(A.NICK_GRACZA) NOT IN ( SELECT UPPER(phpbb_users.username)
                                   FROM `phpbb_users`, `phpbb_groups`, `phpbb_user_group`
                                   WHERE phpbb_groups.group_name = 'BRAK GRUPY'
                                      AND phpbb_groups.group_id = phpbb_user_group.group_id
                                      AND phpbb_user_group.user_id = phpbb_users.user_id )
   AND UPPER(A.NICK_GRACZA) LIKE UPPER('%')
   AND YEAR(A.DATA) >= 2016
   AND MONTH(A.DATA) >= 3
   AND DAY(A.DATA) >= 1
GROUP BY A.NICK_GRACZA
HAVING COUNT(A.NICK_GRACZA) < 3
ORDER BY A.DATA desc, UPPER(A.NICK_GRACZA) asc
LIMIT 0 , 100
ODPOWIEDZ