Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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
Mysql 在两张桌子上数数_Mysql_Sql - Fatal编程技术网

Mysql 在两张桌子上数数

Mysql 在两张桌子上数数,mysql,sql,Mysql,Sql,我有一个mysql数据库,有两个表,预订和用户。 它们通过预订表中的外键用户id链接 如何显示每个用户的预订数量 我一直在尝试此查询的变体: select first_name, last_name, count(*) from bookings left join users on bookings.user_id group by user_id order by count(*); 但它会在相当长的时间内锁定数据库。在书中选择group by: select user_id, c

我有一个mysql数据库,有两个表,预订和用户。 它们通过预订表中的外键
用户id
链接

如何显示每个用户的预订数量

我一直在尝试此查询的变体:

select first_name, last_name, count(*) 
from bookings 
left join users on bookings.user_id 
group by user_id 
order by count(*);

但它会在相当长的时间内锁定数据库。

在书中选择group by:

select user_id, count(1) from bookings group by user_id;

然后,如果需要名称等,请先将此子选择与用户表连接起来,因为ON子句不完整。通常在X=Y上为
,在X上为
。这很重要,因为您要告诉数据库如何链接两个表。我猜这是浪费时间最多的地方

第二,这里使用的左连接是无用的(除非您想要没有用户的预订)。请尝试内部连接

第三,一般来说,最好执行
SmallTable内部连接BigTable
(不一定,您的里程数可能会有所不同)

第四,如前所述,使用ORDERBY子句的别名

尝试:


您是否可以添加运行EXPLAIN SELECT first_name,last_name,count(*)的输出从预订中选择LEFT JOIN users ON bookings.user_id GROUP BY user_id ORDER BY count(*);您是否尝试过为
count(*)
设置别名,并在
order by
子句中使用该别名?可能会加快进程。1简单预订索引NULL fk_用户预订4 NULL 37672使用索引;使用临时设备;使用filesort 1时,简单用户都为NULL 32594,如果将输出粘贴到问题本身中,并缩进四个空格,使其保持预格式化,则会更清晰。另外,添加SHOW CREATE TABLE bookings的输出;并显示创建表的用户@KJF我刚刚意识到,这不会返回零个条目,其中cnt=0。只有1岁以上。你也需要零吗?不,不需要加零。谢谢
select first_name, last_name, count(*) as cnt
from users
inner join bookings on bookings.user_id = user.id
group by user_id
order by cnt;