2012-11-19 4 views
0

여기 내 문제입니다.이 요청 (작동)이 있지만 사용자의 최신 동작으로 TO_DAYS(notification.created_at)을 바꾸고 싶습니다.SQL 쿼리, MAX 함수 또는 동등 물을 사용하십시오.

TO_DAYS(MAX(notification.created_at))을 사용하려고했지만 "#1111 - Invalid use of group function"을 반환합니다.

귀하의 질의에 LEFT JOIN를 사용하지 않는 이유를 이해하지 못하는 모든
SELECT user.email, notification.type, max(notification.created_at) AS date 
    FROM user, notification 
    WHERE (user.id = notification.user_id) AND (TO_DAYS(NOW()) - TO_DAYS(notification.created_at) >= 30) 
    GROUP BY user.id 
    ORDER BY `date` DESC 
+1

어떤 RDBMS를 사용하고 있습니까? –

+1

스키마를 부여하십시오 – banzsh

+1

이것은'GROUP BY '를 사용할 때'SELECT' 부분에있는 모든 열을 그룹화해야하기 때문입니다 ... – shadyyx

답변

0

MAX와 같은 집계 함수를 사용하는 경우 HAVING을 사용해야하며 WHERE는 사용하지 않아야합니다. HAVING은 항상 WHERE 및 GROUP BY 뒤에옵니다.

자세한 내용은 http://www.w3schools.com/sql/sql_having.asp

1

먼저 ... 는 둘째가 셋째, WHERE에서 해당 조건에 가야한다 ... 일 빼기 자체를 변환하기에 충분해야한다 HAVING이 ... 이 넷째, 내가 SELECT에서 date도 탈출해야한다는 생각 ... 이 될 수있다 :

SELECT u.email, n.type, max(n.created_at) AS `date` 
FROM user u 
LEFT JOIN notification n ON u.id = n.user_id 
GROUP BY user.id 
HAVING TO_DAYS(NOW() - MAX(n.created_at)) >= 30 
ORDER BY `date` DESC 

이 하나를 시도 ...

+0

감사합니다. 그러나 Philipi Willemann의 조언을 따랐습니다. 감사합니다. . –