2014-04-14 68 views
2

我有3個表:多內連接MySql中不工作

useractivitylog

id userid activity_type activity_id date 

將存儲所有用戶活動。

requestfriend

opid userid friendid requesttime message source requesttype friendemail status 

將存儲的朋友詳細介紹。 userid and friendid可以是用戶的ID。如果用戶A發送朋友的要求給用戶B,然後用戶標識將包含的ID和friendid將是B的ID,因此無論如何B是A的朋友,A是B.

的朋友

auth_user_profiles

id user_id first_name last_name profileimage 

,其存儲用戶簡檔信息。

我需要的是從useractivitylog表中選擇我所有的朋友活動。我試着用下面的查詢。但它沒有奏效。

echo "select ua.*,rf.opid,aup.user_id,aup.first_name,aup.last_name, 
     aup.profileimage from useractivitylog as ua INNER JOIN requestfriend as rf 
    INNER JOIN auth_user_profiles as aup on 
    aup.user_id= IF (rf.userid='$userid',rf.friendid,rf.userid) 
    WHERE (rf.userid=$userid or rf.friendid=$userid) 
    and rf.status='2' and ua.userid!=$userid"; 

這裏,$userid是我的用戶ID。其實我想要的是檢索配置文件信息和我的朋友的用戶的活動。但是請知道,即使userid不在我的好友列表中,它也會返回useractivitylog表中的所有行。

任何人都可以幫助我找到適當的查詢。提前致謝。

+1

你能解釋*但它沒有工作*?任何錯誤或其他內容 –

+0

即使用戶在useractivitylog表中不是我的朋友,它也會返回所有行。 – Jenz

+0

你有兩個JOIN,但在ON子句中只有一個條件,這似乎可能是罪魁禍首。 – RobP

回答

1

你沒有正確連接。鏈接到其他表的useractivity日誌的唯一條件是其用戶標識不是$ userid。對於表中的大多數記錄來說都是如此,所以你幾乎可以得到一個笛卡爾積(交叉連接)。

順便說一句:你也沒有正確加入auth_user_profiles,因爲你比較字符串'$ userid'而不是與$ userid進行比較。

讓我們重新編寫的語句,我們首先檢索朋友和加入其他表這些:

select 
    ua.*, 
    friend.opid, 
    aup.user_id, 
    aup.first_name, 
    aup.last_name, 
    aup.profileimage 
from 
(
    select distinct 
    case when userid = $userid then friendid else userid end as id, 
    opid 
    from requestfriend 
    where $userid in (userid, friendid) and status = '2' 
) as friend 
inner join useractivitylog as ua on ua.userid = friend.id 
inner join auth_user_profiles as aup on aup.user_id = friend.id; 
+0

謝謝@Thorsten ... – Jenz

0

嘗試如下查詢

select * from useractivitylog a,requestfriend b,auth_user_profiles c 
    WHERE a.userid = b.userid and b.userid = c.userid; 
0

您需要添加一個字段加入關於你的第一個表:

SELECT ua.*, rf.opid, aup.user_id, aup.first_name, aup.last_name, aup.profileimage 
    FROM useractivitylog as ua 
     INNER JOIN requestfriend as rf on fieldname = fieldname 
     INNER JOIN auth_user_profiles as aup on aup.user_id = IF (rf.userid='$userid',rf.friendid,rf.userid) 
WHERE (rf.userid=$userid or rf.friendid=$userid) 
    AND rf.status='2' 
    AND ua.userid!=$userid 
1

這應該工作爲你解釋你需要得到用戶的活動誰是你的朋友,你首先需要加入useractivitylog表到requestfriend其中friendid是在useractivitylogON(rf.friendid =ua.userid)那麼你需要加入auth_user_profiles表,其中userid from useractivitylog表是相等的,即ON(ua.userid=aup.user_id)然後用你在哪裏過濾rf.userid等於提供的用戶id,我沒有得到使用OR rf.friendid = $userid比較當你問朋友活動時的比較,那麼爲什麼比較朋友的id與給定用戶ID

SELECT 
    ua.*, 
    rf.opid, 
    aup.user_id AS aup_user_id, 
    aup.first_name, 
    aup.last_name, 
    aup.profileimage 
FROM 
    useractivitylog AS ua 
    INNER JOIN requestfriend AS rf ON(rf.friendid =ua.userid) 
    INNER JOIN auth_user_profiles AS aup ON(ua.userid=aup.user_id) 

WHERE 
    rf.userid = $userid  
    AND rf.status = '2' 

使用select

SELECT 
    ua.*, 
    aup.user_id AS aup_user_id, 
    aup.first_name, 
    aup.last_name, 
    aup.profileimage 
FROM 
    useractivitylog AS ua 
    INNER JOIN auth_user_profiles AS aup ON(ua.userid=aup.user_id) 
WHERE 
ua.userid IN (
SELECT friendid FROM requestfriend WHERE userid =$userid AND `status` = '2' 
) 
+0

這是顯示useractivity日誌中的所有記錄,其中userid是我的id ..實際上,我需要的是顯示我的朋友的所有活動..不是我的。 – Jenz

+0

@Jenz我想加入的查詢應該按預期爲您所需的結果集我還提供了另一種解決方案,請參閱我的更新回答 –

+0

@ Khalid ..它正在返回空結果集。 – Jenz

0

子你可以從另一個側面去你的數據... 與選擇所有的朋友開始,如果你有他們,得到他們的數據:

SELECT 
    ua.*, 
    rf.opid, 
    aup.user_id, 
    aup.first_name, 
    aup.last_name, 
    aup.profileimage 
FROM 
    requestfriend AS rf 
JOIN 
    useractivitylog AS ua ON (ua.userid = rf.friendid) 
JOIN 
    auth_user_profiles AS uap ON (uap.userid = rf.friendid) 
WHERE rf.userid = $userid AND rf.status = '2' 

與您requestfriend表反之亦然連接其餘的應該是沒有問題的。

由於friendrequests應該是沒有那麼多的活動,這可能會導致如果你有數據的加載性能更好...