Mysql 在两张桌子上数数
我有一个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
用户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;