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