2017-04-10 96 views
0

我有我的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   | 

要得到号登录的每个用户,我可以在发送另一查询的语句。但最终会消耗资源并使服务器变慢。

我可以在单个连接查询中得到这个结果吗?

+1

包括您尝试过的内容。那么你将得到解决方案 –

回答

2

是的,你可以,你必须使用数为每个用户登录用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 byselect

+0

谢谢Zanini先生,如果日志表中有另一列“标志”(例如:0或1),我需要参考标志列来获得登录数。我的意思是我需要WHERE子句来获得计数(t2.sid)? – user1942626

+0

编辑我的答案 –

0
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; 

如果你想要所有的结果,你需要一个外连接,而不是内连接。

1

我想最好的,我的意思是最少的资源消耗的方式是添加“number_of_login”用户表,只是每次他/她登录时间增加了,因为其他任何解决方案都需要循环

0

从用户a选择a.sid,a.userid,a.username,COUNT(b.sid) 左连接日志b ON b.sid = a.sid group by a.sid