2012-03-01 124 views
1

道歉,如果我錯了,我有我的數據庫3表的名字userview_historyonline_status條件在MySQL查詢

用戶

user_id first_name last_name 
    2   jhon   watson 
    4   boob   hasel 
    5   hena   Montena 

view_history

user_id pv_user_id 
4   2 
5   2 

online_status

user_id 
    4 

簡介:

1)user table is user basic information of user, 
2)view_histroy table is profile viewer,that is by above `view_history` table user `4` had looked into user `2` profile etc. 
3)online_status table with one column user_id consist records of user id's who are online, if they are offline then record will be deleted. 

所以,現在我想查詢,列出誰一直看着2個人資料與在線狀態 我寫了下面的查詢:

SELECT 
     view_history.user_id, 
     view_history.pv_date, 
     user.first_name, 
     user.last_name, 
     online_status.user_id 
    FROM 
     view_history, 
     user, 
     online_status 
    WHERE 
     view_history.user_id = user.user_id 
    AND online_status.user_id = user.user_id 
    AND view_history.pv_user_id = 2 

,但我沒有得到用戶5誰在線的信息。 幫幫我!感謝提前

回答

1

您需要使用現代JOIN語法,它允許你做一個LEFT JOIN,這是你需要的東西:

SELECT 
    view_history.user_id, 
    view_history.pv_date, 
    user.first_name, 
    user.last_name, 
    online_status.user_id 
FROM user 
LEFT JOIN view_history ON view_history.user_id = user.user_id 
LEFT JOIN online_status ON online_status.user_id = user.user_id 
WHERE user.user_id = 2 

一個LEFT JOIN意味着你仍然可以得到一排,即使沒有匹配行(如果沒有匹配的行,則從左連接表中的列將具有null值)

我已將表格重新排序爲更加健全的順序,並更改了where子句以查找用戶記錄。

我也建議你在view_history上也使用LEFT JOIN,以防沒有歷史記錄。

而且,這個語法可以很容易地看到什麼是加入謂詞,對什麼是過濾謂詞

+0

你能告訴我查詢嗎.. – 2012-03-01 14:10:09

+0

謝謝波希米亞人 – 2012-03-01 14:15:14

0

是的,因爲你的條件

online_status.user_id = user.user_id 

而且在online_status表,只有user_id 4.

0

您的子句AND online_status.user_id = user.user_id排除了離線用戶的信息。考慮使用LEFT JOIN

0
  1. 由於我們正在查找查看用戶配置文件的用戶,我們需要在pv_user_id列上添加一個過濾器。同時左加入,我發現它更好地在左邊的ON狀態下把過濾器加入使得生成

  2. 內的結果之前,他們正在申請加入到online_status限制了誰是在線用戶

  3. 我已經返工@波希米亞的查詢下面

    SELECT 
    view_history.user_id, 
    view_history.pv_date, 
    user.first_name, 
    user.last_name, 
    online_status.user_id 
    FROM user 
    INNER JOIN online_status ON online_status.user_id = user.user_id 
    LEFT JOIN view_history ON view_history.user_id = user.user_id AND pv_user_id = 2 
    
0

在這種情況下,你必須使用LEFT JOIN來獲取在線狀態和歷史記錄的用戶的所有信息。

SELECT 
vh.user_id, 
vh.pv_date, 
u.first_name, 
u.last_name, 
os.user_id 
FROM user u 
LEFT JOIN view_history vh ON vh.user_id = u.user_id 
LEFT JOIN online_status os ON os.user_id = u.user_id 
WHERE u.user_id = 2 

如果您使用的是內部連接,那麼只有那些在線的用戶信息出現。