2012-09-29 44 views
0

我有一個MYSQL'活動'表,用戶的所有活動都被記錄下來。假設用戶的活動可以是提問或回答問題。因此,如果用戶提出問題,則他們的問題將被放入「問題」表中,並且該活動也會被放入「活動」表中。如果用戶提供了答案,除非答案進入「答案」表和「活動」表中,否則同樣的事情。將活動表與MYSQL中的源表聯繫起來

問題表的字段有:

q_id   question 

的答案表的字段有:

a_id   q_id  answer 

活動表的字段有:

activity_id q_id user_id  action_type 

(有更多的欄目,然後顯示以上,但這些說明了這一點。)

我想要做的就是顯示用戶最近在網站上的操作,並實際顯示操作是什麼。

我目前的MySQL查詢簡單地加入活動表如下(使用PDO)的問題表:

"SELECT * 
FROM activity 
LEFT JOIN question ON activity.q_id = question.q_id 
WHERE activity.user_id = :user_id 
ORDER BY activity.a_id desc" 

這工作好,並且可以隨時給我在活動列表中顯示的問題。但是,如果返回的活動是答案,我希望能夠顯示答案。我嘗試了用三加入如下:

"SELECT * 
FROM activity 
LEFT JOIN question ON activity.q_id = question.q_id 
LEFT JOIN answers ON activity.q_id = answers.q_id 
WHERE activity.user_id = :user_id 
ORDER BY activity.a_id desc" 

但這只是給了我行的列表是隻要先查詢兩次,當ACTION_TYPE是一個答案不顯示的答案。

我認爲這應該是可能的,但我認爲它越多我相信也許我應該廢除活動表,並直接使用UNION在問題和答案表上執行查詢?對此決定有何意見,以及對查詢的任何想法?

回答

2

你可以使用一個外連接,這將在活動表中返回的一切,即使沒有相應的行中的回答表:

SELECT * 
FROM activity 
LEFT JOIN question ON activity.q_id = question.q_id 
LEFT OUTER JOIN answers ON activity.q_id = answers.q_id 
WHERE activity.user_id = :user_id 
ORDER BY activity.a_id desc 

我假設,每q_id值在活動表中,問題表中總會有一個對應的行。

要解決與重複答案的問題,我會添加一個a_id字段到活動表。對於問題活動,您將其設置爲NULL,並且對於每個答案,您都會將a_id字段設置爲相應的a_id值,以確定哪個答案與活動一起進行。然後,您將如下調整SQL:

SELECT * 
FROM activity 
LEFT JOIN question ON 
    activity.q_id = question.q_id 
LEFT OUTER JOIN answers ON 
    activity.q_id = answers.q_id AND 
    activity.a_id = answers.a_id 
WHERE activity.user_id = :user_id 
ORDER BY activity.a_id desc 
+0

似乎並不想工作。它返回的方式太多重複和不匹配的答案和問題。不知道爲什麼會這樣。是的,活動中的每個q_id在問題表中都有對應的行,但不一定在答案表中。對於要顯示的每一行,它應該能夠首先顯示活動類型(問題或答案),如果它的問題比它應該只顯示問題,並且如果類型是答案,它應該能夠顯示問題和答案。 – Cbomb

+0

當我看到這件事時,我知道有什麼東西在困擾着我。問題是在活動表中,你只有q_id字段,所以數據庫無法知道哪個答案與哪個活動相關。因此,它將問題的每個答案帶回問題的每個答案。我將以我如何解決問題來編輯我的答案。 –

+0

在我的小規模測試中,只用了幾行就完美了。明天我會將它應用到我的完整數據庫,並希望它仍然可以工作。應該已經意識到問題的答案不知道該去哪裏。 – Cbomb