在Select Mysql语句中选择
所以我有3个表,db,db2,db3。我需要db中的所有行,还需要db2和db3中的总数。我想在一个查询中完成这项工作,下面的查询很有效在Select Mysql语句中选择,mysql,sql,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是否进行了优化,使其运行一次,使其成为常量,并将其添加到每一行?? 重要的是
SELECT *, (SELECT COUNT(*) FROM db2) AS total2, (SELECT COUNT(*) FROM db3) AS total3
FROM db
我想知道的是,既然这些嵌套的SQL查询显示在每一行中,它们运行的次数有那么多吗?或者mysql是否进行了优化,使其运行一次,使其成为常量,并将其添加到每一行??
重要的是要知道,以防数据库变得相当大
请回答并参考相关文件,不胜感激 我不确定mysql是否缓存或优化了您问题中的子查询,但您可以使用交叉连接重写查询,以确保count查询只运行一次
select * from db
cross join (select count(*) as total2 from db2) t1
cross join (select count(*) as totla3 from db3) t2
更新
我检查了查询计划,mysql已经优化了原始查询,因为它认识到它不是一个依赖子查询。请注意,select\u type
是子查询
,它只运行一次,而依赖子查询
,每行运行一次(请参阅)
子查询
+----+-------------+-------+-------+---------------+-----------------------+---------+------+-------+-------------+
| 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 |
+----+-------------+------------+--------+---------------+-----------------------+---------+------+-------+-------------+
+----+-------------+------------+--------+---------------+-----------------------+---------+------+-------+-------------+
|id |选择|类型|类型|可能的|键|键|列|参考|行|额外|
+----+-------------+------------+--------+---------------+-----------------------+---------+------+-------+-------------+
|1 |主| |系统|空|空|空|空| 1 |空|
|1 | PRIMARY | t2 | ALL | NULL | NULL | NULL | NULL | 106 | NULL|
|2 |派生| t3 |索引| NULL | id | 4 | NULL | 38511 |使用索引|
+----+-------------+------------+--------+---------------+-----------------------+---------+------+-------+-------------+
所以基本上您需要做的是将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
语句-在我的示例中,它的一些_equal_键
是的,它们会。它们可能会被数据库缓存,并且有效地只运行一次,但是有更好/更简单的方法可以做到这一点。e、 g.单独运行计数,然后在获取行时将它们的值插入主select*
。术语:一个数据库中有3个表。哇,太简单了。谢谢从没听说过克罗斯joins@lonewarrior556请看更新,看起来交叉连接是没有必要的毕竟谢谢你的深入,我仍然了解交叉连接,他们可以使用。所以我很感激这两个答案。如果他们没有共享密钥呢?您是否希望db2.total_number对表中的所有行求和?