将mysql子查询转换为Left Join

时间:2015-10-20 07:46:16

标签: mysql

假设我有下表:

    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

这是my reference

谁能告诉我哪里做错了? 问候

3 个答案:

答案 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

希望这有帮助