4

我有一个表,其中包含所有可下载项目的记录,另一个表包含每个下载的记录,其中包括下载日期和项目的 id 以及下载它的用户。

当我从数据库中获取项目列表时,我希望查询查找项目已下载多少次并将其与其他项目数据一起包含。

这是我的 SQL:

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”的额外列,其中包含正确的计数,但它不会让我按这个值排序。

我需要做什么才能按子查询中返回的值对我的结果进行排序?

如果您需要更多信息,请告诉我!

编辑 - 示例数据

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

我期望的结果是:

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

谢谢

4

3 回答 3

14

尝试,

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
于 2013-02-18T15:29:02.033 回答
0

除非我忽略了它,否则期望结果中包含 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

于 2013-02-18T16:54:00.467 回答
0

尚未测试,但另一种方法:

SELECT t1.* 
FROM tl_items AS t1 
ORDER BY 
(SELECT COUNT(*) totalCount
FROM tl_downloads 
WHERE item_id = t1.id
AND download_date > ? ORDER BY totalCount [desc])

对?由于没有连接,可能更快。

于 2020-03-24T16:28:28.567 回答