2017-04-10 101 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