mysql - 将 mysql 子查询转换为 Left Join

标签 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

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

最佳答案

您的第二个查询无法按您希望的方式工作,因为它根本不匹配联接中的任何记录。看:

您根据以下条件声明某个查询与其自身之间的联接:

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/

相关文章:

mysql - 如何在MySql中将+1添加到代码 ' 001'和代码 ' 009 '?

php - 多语言 MySQL 内容 : how to select a given language or another if the one specified isn't available?

MySQL - 提高多国性能

php - 输入数据从 'A' 表中获取数据,然后用数据检查 'B' 表,然后当数据不在 'B' 表中时显示数据

php - 如何在一个while循环中使用2个fetch_assoc?

php - 根据wordpress的id获取数据

mysql - 自动递增id 0

mysql - 将sql命令命令写入文件

mysql - 对派生表的结果进行分组连接

mysql - 在 VBA mysql 查询中使用循环更改变量?