MySQL的加入两个不同的表
我有我的MySQL数据库的两个表:MySQL的加入两个不同的表
user
- sid
- userid
- username
log
- sid
- userid
- login_time
正如您可以猜到,有一个在日志表很多更多的记录比用户表。 我正在使用php以表格形式在我的网站上显示这些记录,如下所示。
no | userid | username | number of login |
1 | inzo | harvey | 233 |
2 | chae | schmidts | 433 |
3 | hibro | swainy | 12 |
要得到号登录的每个用户,我可以在发送另一查询的语句。但最终会消耗资源并使服务器变慢。
我可以在单个连接查询中得到这个结果吗?
是的,你可以,你必须使用数为每个用户登录用group by
select t1.userid, t1.username, count(t2.sid)
from user t1
left join
log t2
on t1.userid = t2.userid
group by t1.userid, t1.username
的left join
确保您用户无需登录仍将被退回,机智0作为计数。
编辑
关于在评论的问题:如果你想只算一个特定的标志值的登录,你可以在group by
前加where flag = x
;如果你想为每个标志的值有一个单独的计数,你必须将该标志添加到group by
和select
。
谢谢Zanini先生,如果日志表中有另一列“标志”(例如:0或1),我需要参考标志列来获得登录数。我的意思是我需要WHERE子句来获得计数(t2.sid)? – user1942626
编辑我的答案 –
SELECT TABLE_A.row_id, TABLE_A.category, TABLE_A.val_1, TABLE_B.val_2
FROM TABLE_B
LEFT OUTER JOIN TABLE_A ON TABLE_B.row_id = TABLE_A.row_id
ORDER BY row_id;
如果你想要所有的结果,你需要一个外连接,而不是内连接。
我想最好的,我的意思是最少的资源消耗的方式是添加“number_of_login”用户表,只是每次他/她登录时间增加了,因为其他任何解决方案都需要循环
从用户a选择a.sid,a.userid,a.username,COUNT(b.sid) 左连接日志b ON b.sid = a.sid group by a.sid
包括您尝试过的内容。那么你将得到解决方案 –