【问题标题】:Sort by result of sub query in MySQL在 MySQL 中按子查询的结果排序
【发布时间】:2026-02-19 07:30:01
【问题描述】:

我有一个表,其中包含所有可下载项目的记录,另一个表包含每次下载的记录,其中包括下载日期和项目的 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

谢谢

【问题讨论】:

  • 您的示例实际上似乎工作得很好:SQL Fiddle。但无论如何,加入可能是更好的解决方案。

标签: mysql subquery


【解决方案1】:

试试,

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

【讨论】:

  • 谢谢。如果没有 download_date WHERE 子句,这似乎可以正常工作,但是当我包含它时,我遇到了与以前相同的问题。
  • 您能否提供样本记录以及可能的预期结果?它可以帮助我更多地理解问题:D
  • 没问题,我在原始问题中提供了一个示例。感谢您的帮助
  • 与标准连接等效项相比,这为我提供了 10 倍的性能提升
  • 您可以尝试 John Woo 的答案,但使用 RIGHT JOIN 而不是 LEFT JOIN。当我将此查询与 LEFT JOIN 一起使用时,我的查询花费了大约 800 毫秒,而 RIGHT JOIN 不到 5 毫秒
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    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])
    

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

    【讨论】: