在Select Mysql statment

时间:2015-11-16 17:04:59

标签: mysql sql

所以我有3个表,db,db2,db3。我需要db中的所有行,还需要db2和db3中的总数。我想在一个查询中执行此操作并且下面的查询有效..

SELECT *, (SELECT COUNT(*) FROM db2) AS total2, (SELECT COUNT(*) FROM db3) AS total3  
FROM db

我想知道的是,因为那些嵌套的SQL查询出现在每一行中,它们会运行那么多次吗?或者mysql是否优化使得它运行一次,使其成为常量,并将其添加到每一行? 重要的是要知道db变得非常大;

非常感谢对此文档的答案和参考。

2 个答案:

答案 0 :(得分:2)

我不确定mysql是否在您的问题中缓存或优化子查询,但您可以使用交叉连接重写查询以确保计数查询仅运行一次

select * from db
cross join (select count(*) as total2 from db2) t1
cross join (select count(*) as totla3 from db3) t2

<击>

<强>更新

我检查了查询计划,mysql已经优化了原始查询,因为它识别出它不是依赖子查询。请注意select_typeSUBQUERY,只运行一次,而不是DEPENDENT SUBQUERY,每行运行一次(参见Difference between Subquery and Correlated Subquery

<强>子查询

+----+-------------+-------+-------+---------------+-----------------------+---------+------+-------+-------------+
| id | select_type | table | type  | possible_keys | key                   | key_len | ref  | rows  | Extra       |
+----+-------------+-------+-------+---------------+-----------------------+---------+------+-------+-------------+
|  1 | PRIMARY     | t2    | ALL   | NULL          | NULL                  | NULL    | NULL |   106 | NULL        |
|  2 | SUBQUERY    | t1    | index | NULL          | id                    | 4       | NULL | 38511 | Using index |
+----+-------------+-------+-------+---------------+-----------------------+---------+------+-------+-------------+

交叉加入

+----+-------------+------------+--------+---------------+-----------------------+---------+------+-------+-------------+
| id | select_type | table      | type   | possible_keys | key                   | key_len | ref  | rows  | Extra       |
+----+-------------+------------+--------+---------------+-----------------------+---------+------+-------+-------------+
|  1 | PRIMARY     | <derived2> | system | NULL          | NULL                  | NULL    | NULL |     1 | NULL        |
|  1 | PRIMARY     | t2         | ALL    | NULL          | NULL                  | NULL    | NULL |   106 | NULL        |
|  2 | DERIVED     | t3         | index  | NULL          | id                    | 4       | NULL | 38511 | Using index |
+----+-------------+------------+--------+---------------+-----------------------+---------+------+-------+-------------+

答案 1 :(得分:0)

基本上你需要做的是将join db2和db3导入db。要做到这一点,你应该首先从db2和db3中选择你需要的东西(如果不需要,我不会选择所有内容,它只会使查询更长/更慢)。然后将db2连接到db3,将db3连接到db,并提供所需的所有信息。

Select
  db2.total_number,
  db3.total_number,
  db.*
From
  db2 
Inner Join
  db3 On db2.some_equal_key = db3.some_equal_key
Inner Join
  db On db3.some_equal_key = db.some_equal_key

请注意,连接表至少需要一个相同的值(例如相同的主键)。这将用于join语句 - 在我的示例中为some_equal_key