Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Select Mysql语句中选择_Mysql_Sql - Fatal编程技术网

在Select Mysql语句中选择

在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是否进行了优化,使其运行一次,使其成为常量,并将其添加到每一行?? 重要的是

所以我有3个表,db,db2,db3。我需要db中的所有行,还需要db2和db3中的总数。我想在一个查询中完成这项工作,下面的查询很有效

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对表中的所有行求和?