2013-02-18 2 views
2

다운로드 할 수있는 모든 항목에 대한 레코드를 포함하는 테이블 하나와 다운로드 날짜와 해당 항목의 ID 및 사용자를 포함하는 각 다운로드 레코드가 포함 된 테이블이 있습니다. 그것을 다운로드했다.MySQL의 하위 쿼리 결과로 정렬

데이터베이스에서 항목 목록을 가져올 때 항목이 다운로드 된 횟수를 조회하고 다른 항목 데이터와 함께이 항목을 포함하도록 쿼리를 원합니다.

SELECT t1.*, 
(SELECT COUNT(*) 
    FROM tl_downloads 
    WHERE item_id = t1.id 
    AND download_date > ?) 
AS downloads_count 
FROM tl_items AS t1 
ORDER BY downloads_count DESC 

위의 쿼리가 나는 정확한 수를 포함 'downloads_count'라는 결과에 여분의 열을 얻을 의미에서 잘 작동하지만이가 나에게 주문을 못하게 : 여기

내 SQL입니다 값.

하위 쿼리에서 반환 된 값으로 내 결과를 정렬하려면 무엇을해야합니까?

추가 정보가 필요하면 알려주세요.

편집 - 샘플 데이터

tl_items    tl_downloads 

id name    id item_id download_date 
1 Item 1    1 1  1385964000 
2 Item 2    2 1  1385964000 
3 Item 3    3 3  1385964000 

나는 것이 예상 결과 : 0 다운로드를 기대

Item 1 - Downloads 2 
Item 3 - Downloads 1 
Item 2 - Downloads 0 

감사

+0

귀하의 예를 실제로 잘 작동하는 것 같다 : [SQL 바이올린] (http://sqlfiddle.com/#!2/3107f/2/0). 하지만 어쨌든 더 나은 솔루션이 될 것입니다. – hsan

답변

9

시도,

SELECT t1.*, 
     s.totalCount AS downloads_count 
FROM tl_items AS t1 
     LEFT JOIN 
     (
      SELECT item_id, COUNT(*) totalCount 
      FROM tl_downloads 
      WHERE download_date > ? 
      GROUP BY item_id 
     ) s ON s.item_id = t1.id 
ORDER BY downloads_count DESC 
+0

감사합니다. 그것은 download_date WHERE 절이없이 잘 작동하는 것처럼 보이지만 이전에 포함시킬 때와 같은 문제가 발생합니다. – jd182

+0

샘플 레코드를 기록하고 원하는 결과를 제공 할 수 있습니까? 문제를 더 잘 이해하는 데 도움이됩니다. D –

+0

문제는 없지만 원래 질문에 예제를 제공했습니다. – jd182

0

포함한다 결과 및 다운로드 날짜 제약 조건은 내가 그것에 대해 간과하지 않는 한 내게 모순되는 것으로 보입니다.

SELECT tt1.id, COUNT(tt2.id) AS DOWNLOAD_COUNT 
FROM t1_items tt1 
LEFT JOIN t1_downloads tt2 ON tt1.id = tt2.item_id 
WHERE download_date > 1385963000 OR download_date IS NULL 
GROUP BY tt1.id 
ORDER BY DOWNLOAD_COUNT DESC 

위 쿼리는 예상 된 결과를 반환합니다.

http://www.sqlfiddle.com/#!2/29b39/13