Mysql 如何获取SQL中所有包的最新包?

Mysql 如何获取SQL中所有包的最新包?,mysql,sql,Mysql,Sql,我有两个表,packages(id、名称作为属性)和releases(url、上传时间、下载字节作为属性)。每个包可以有任意多个版本。我想要一份所有软件包及其最新版本的列表 目前,我有以下工作代码: sql = ("SELECT `packages`.`id`, `name` FROM `packages`") cursor.execute(sql) packages = cursor.fetchall() for pkg in packages: sql = ("SELECT `url

我有两个表,
packages
(id、名称作为属性)和
releases
(url、上传时间、下载字节作为属性)。每个包可以有任意多个版本。我想要一份所有软件包及其最新版本的列表

目前,我有以下工作代码:

sql = ("SELECT `packages`.`id`, `name` FROM `packages`")
cursor.execute(sql)
packages = cursor.fetchall()
for pkg in packages:
    sql = ("SELECT `url` FROM `releases` "
           "WHERE `package_id` = %s "
           "AND `downloaded_bytes` = 0 "
           "ORDER BY `upload_time` DESC LIMIT 1")
    cursor.execute(sql, (pkg['id'], ))
    url = cursor.fetchone()
    if url is not None:
        package_url = url['url']
        package_analysis.main(pkg['name'], package_url)
        logging.info("Package '%s' done.", pkg['name'])
然而,我认为这是一个丑陋的解决方案,因为我执行了很多查询,而我应该只执行一个查询

我可以在一个查询中完成此操作吗?查询是什么样子的

请注意:我只希望每个包有一个结果。这意味着,包
numpy
应该只给出
url=”的结果https://pypi.python.org/packages/cp35/n/numpy/numpy-1.10.1-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl“
(版本1.10.1)而不是99结果

我试过的
但这似乎为上传时间(以及
url
)提供了一个随机值。

您可以尝试以下查询:

select p.id, p.name, r.url, r.upload_time, r.release_number from
(select p.id, max(r.release_number) release_number from packages p
join releases r on p.id = r.package_id
group by p.id) a
join packages p on p.id = a.id
join releases r on r.release_number = a.release_number
它假设发布号是可排序的,如果不可能,您可以使用最大上载时间来代替。

基于(谢谢)提到它:

SELECT
    `packages`.`id`,
    `packages`.`name`,
    `o`.`url`,
    `o`.`upload_time`,
    `o`.`release_number`
FROM
    `releases` o
LEFT JOIN
    `releases` b  ON `o`.`package_id` = `b`.`package_id`
    AND `o`.`upload_time` < `b`.`upload_time`
JOIN
    `packages` ON `packages`.`id` = o.package_id
WHERE
    `b`.`upload_time` is NULL
    AND `o`.`downloaded_bytes` = 0
ORDER BY
    `packages`.`name`
LIMIT 10
选择
`包“.`id`,
`包`.`name`,
`o`.`url`,
`o`.`upload\u time`,
`o`.`发布号`
从…起
`发布'o
左连接
`发布'o'上的'b'。'package\u id`='b`.'package\u id``
和'o`.'upload\u time`.'b`.'upload\u time`.'`
参加
`packages`ON`packages`.`id`=o.packages\u id
哪里
`b`.`upload\u time`为空
和'o`.'downloaded_bytes`=0
订购人
`软件包`.`名称`
限制10

查询在几分之一秒内完成执行。

您可能需要按
upload\u time
排序以满足问题。出于测试目的,我添加了
WHERE p.name=“numpy”
。结果是91个。它应该只给出1。特别糟糕:
r.url
似乎不属于(总是)p.name。True。内部查询中按
p.id
分组没有意义。若要按包获取最大发布号,需要按p.id分组,因此内部查询中的分组有意义。从查询@moosetred中,url属于发布表。您可能想看看这个问题:这是问题的一般形式。(在我看来)最好的答案是使用左连接。
SELECT
    `packages`.`id`,
    `packages`.`name`,
    `o`.`url`,
    `o`.`upload_time`,
    `o`.`release_number`
FROM
    `releases` o
LEFT JOIN
    `releases` b  ON `o`.`package_id` = `b`.`package_id`
    AND `o`.`upload_time` < `b`.`upload_time`
JOIN
    `packages` ON `packages`.`id` = o.package_id
WHERE
    `b`.`upload_time` is NULL
    AND `o`.`downloaded_bytes` = 0
ORDER BY
    `packages`.`name`
LIMIT 10