假设我有下表:
id parent
1 1
2 1
3 1
4 1
5 2
6 5
7 5
我想执行以下查询:
SELECT id_table.parent,id_table.count_id
FROM
(SELECT count(id) AS count_id,parent FROM item group by parent) AS id_table
WHERE id_table.count_id =
(SELECT max(count_id) AS max_count_id FROM
( SELECT count(id) AS count_id,parent
FROM item group by parent ) AS id_table2 )
获得以下结果:
parent count_id
1 4
我尝试转换查询以优化性能:
SELECT id_table.parent,id_table.count_id FROM
(SELECT count(id) AS count_id,parent FROM item GROUP BY parent)
AS id_table
LEFT JOIN
(SELECT count(id) AS count_id,parent FROM item GROUP BY parent )
AS id_table2
ON id_table.parent=id_table2.parent AND id_table.count_id<id_table2.count_id
WHERE id_table2.parent IS NULL
但是得到了以下结果,我不想要:
parent count_id
1 4
2 1
5 2
谁能告诉我哪里做错了? 问候
答案 0 :(得分:1)
您的第二个查询无法正常工作,因为它与连接中的任何记录都不匹配。看:
根据以下条件,您声明某个查询与其自身之间的连接:
ON id_table.parent=id_table2.parent AND id_table.count_id<id_table2.count_id
这意味着:选择第一个查询中的所有记录(因为它是LEFT连接),来自第二个查询的每个记录具有相同的parent
和{{ 1}}低于第一个查询。 ¡!
正如您所看到的,这是荒谬的:因为自动连接查询会返回以下记录:
count
... count_id parent
4 1
2 2
2 5
列是事实上的 PK。所以。该对(4,1)没有匹配的对(x,1),其中x <4。 (同上其余的一对。)
这是你的错误:来自MySQL的示例在这里不适用,因为在parent
表中,肯定有多个记录具有相同的shop
值,不是你的情况(article
在自动加入的查询中有唯一值。)
基于连接的唯一查询公式是我想的:
parent
...但我怀疑这种复杂性会改善你的第一种方法的表现。
答案 1 :(得分:0)
根据您想要获得的输出,我得到了一个更简单的解决方案。也许我不明白你的问题,但我会试一试。
为什么要使用你的查询(有点冗长):
SELECT id_table.parent,id_table.count_id
FROM
(SELECT count(id) AS count_id,parent FROM item group by parent) AS id_table
WHERE id_table.count_id =
(SELECT max(count_id) AS max_count_id FROM
( SELECT count(id) AS count_id,parent
FROM item group by parent ) AS id_table2 )
我用更简单的查询来完成相同的结果。
SELECT parent, count(id) as count_id FROM items GROUP BY 1 ORDER BY 2 DESC LIMIT 1
答案 2 :(得分:-1)
获得以下结果。
parent count_id
1 4
你能看看这个
吗?SELECT parent,count(*) AS parent_count FROM parent group by parent
ORDER BY parent_count DESC LIMIT 1
希望这有帮助