2009-05-13 1 views
2

GROUP BY, ORDER BY - 항목의 최신 모양을 고려하여 그룹을 만드는 방법

이 쿼리 (가독성을 위해 포맷 된 MySQL 5.X, PHP -)

$query =" 
SELECT 
    p.p_pid, 
    p.p_name, 
    p.p_url 
FROM 
    activity a, 
    products p 
WHERE 
    a.a_uid= ".$uid_int." 
    AND a.a_pid > 0 
    AND p.p_pid = a.a_pid 
GROUP BY 
    a.a_pid 
ORDER BY 
    a.a_time DESC LIMIT 6 
"); 

일반적으로 사용자가 본 6 가지 최신 제품의 고유 목록을 생성해야합니다.

사용자가 제품을 두 번 이상 본 경우 문제가 발생합니다. 마지막 6 가지 활동 중 하나와 최근 6 가지 활동 이전의 활동 중 하나가 쿼리가 제품을 반환하지 않습니다. 나는 (그룹별로) 제품의 가장 최근 출시 시간과 함께 a_time을 떠나지 않는다고 가정합니다. 어떻게 해결할 수 있습니까?

답변

2

MAX (a.a_time)로 주문을 시도 했습니까?

SELECT 
    p.p_pid, 
    p.p_name, 
    p.p_url 
FROM products p 
INNER JOIN activity a on p.p_pid = a.a_pid 
WHERE 
    a.a_uid= ".$uid_int." 
GROUP BY 
    p_pid, p_name, p_url 
ORDER BY 
    max(a.a_time) DESC 
    LIMIT 6 

가장 좋은 방법은 집계없이 사용하는 모든 열에서 GROUP BY를 사용하는 것입니다. MySQL은 그룹화되지 않은 열을 사용할 수있게 해주는 몇 안되는 데이터베이스 중 하나입니다. 선택한 행에서 임의의 열을 제공합니다.

1

$uid_int 변수가 SQL 인젝션을 위해 두 번 확인되기를 바랍니다. 명시 적 집계하지 않고 그룹화 할 수 MySQL에서 좋은 디자인 결정했다 경우

$query =" 
SELECT 
    MAX(p.p_pid) p_pid, 
    MAX(p.p_name) p_name, 
    MAX(p.p_url) p_url 
FROM 
    activity a 
    INNER JOIN products p ON p.p_pid = a.a_pid 
WHERE 
    a.a_uid= ".$uid_int." 
    AND a.a_pid > 0 
GROUP BY 
    a.a_pid 
ORDER BY 
    MAX(a.a_time) DESC 
LIMIT 6 
"); 

은 가끔 ...

+0

감사를 궁금해! 왜 내가 p_name 등에 MAX를 필요로합니까? 이들은 문자열입니다. – Nir

+0

처음 쓴 것처럼, a.a_pid의 그룹은 실제로 p의 그룹입니다. 따라서 그는 제품별로 그룹화하고 활동중인 마지막 6 개 제품을 찾고 싶어합니다. – Andomar

+1

@Nir : 이것은 * 문자열이 아닙니다. 이들은 a.a_pid로 그룹화 된 * 문자열 그룹입니다. 그렇기 때문에 집계 함수를 사용하여 그룹의 한 문자열을 선택해야합니다. MySQL은 여기에 약간의 불편 함을 허용하지만 심지어 편리한 것처럼 보이는 집계 함수를 사용하지 않는 경우에도 문제가 발생했습니다. – Tomalak