假设我有下表:
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
谁能告诉我哪里做错了? 问候
最佳答案
您的第二个查询无法按您希望的方式工作,因为它根本不匹配联接中的任何记录。看:
您根据以下条件声明某个查询与其自身之间的联接:
ON id_table.parent=id_table2.parent AND id_table.count_id<id_table2.count_id
这意味着:选择第一个查询中的所有记录(因为它是左连接),以及具有相同父级
的第二个查询中的每条记录 count
低于第一个查询。 ¡!
如您所见,这是荒谬的:因为自动联接查询返回这些记录:
count_id parent
4 1
2 2
2 5
...parent
列是事实上的 PK。所以。对 (4,1) 没有 x<4 的匹配对 (x,1)。 (其余的对同理。)
那是你的错误:来自 MySQL 的示例在这里不适用,因为在 shop
表中,肯定有不止一条具有相同 article
值的记录,这不是 (parent
在自动连接查询中具有唯一值)。
我想到的唯一基于联接的查询公式是这样的:
SELECT count_id, parent
FROM (SELECT count(id) AS count_id,parent FROM item GROUP BY parent) query1
INNER JOIN (SELECT MAX(query2.count_id) as max_id FROM (SELECT count(id) AS count_id,parent FROM item GROUP BY parent) query2) queryMax ON query1.count_id=queryMax.max_id;
...但我怀疑这种复杂性是否会提高第一种方法的性能。
关于mysql - 将 mysql 子查询转换为 Left Join,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33230856/