2014-01-25 75 views
0

我敢肯定,這以前有人問,但我不能讓我的代碼工作:(SQL合併使用COUNT(),並留下了兩個或三個表JOIN

但是也有一些用戶提出多個問題我需要爲還挺用戶搜索顯示的用戶,然後顯示多少問題每個用戶都要求

表1(用戶): ID, 用戶名, 密碼, 頭像, reg_date, is_banned( ETC ...)

表2(問題): ID, questioner_id, 問題, 答案1, 答案2, 答案3(ETC ...)

我需要合併兩個,然後顯示像普通用戶信息用戶名等,但也計算questioner_id行,並顯示用戶提出了多少問題。

這是我迄今爲止,但它只是吐出了一個結果,並計算一切:

SELECT 
    users.id, 
    users.username, 
    users.avatar_location, 
    users.datetime, 
    users.last_action, 
    users.last_action_description, 
    users.is_banned, 
    COUNT(questions.questioner_id) 
FROM 
    `users` 
LEFT JOIN 
    `questions` 
ON 
    users.id = questions.questioner_id 
ORDER BY 
    datetime 
    ASC 

我很抱歉提前爲我徹底的「noobiness」。我已經找了一兩個小時瞭解如何做到這一點,但我一直無法解決它。

非常感謝

編輯:

非常感謝您的幫助!我最後的附加問題是我現在有另外一個第三個表格,這次我想要回答現在有問題的問題。

表3(questions_answered): ID, question_id, USER_ID, 正確(ETC ...)

我試着將它添加到我的查詢,但不是顯示的問題數回答了重複提問的結果。

這是我更新的查詢(對不起再次,我只是努力讓我的腦袋解決這個問題)

SELECT 
    users.id, 
    users.username, 
    users.avatar_location, 
    users.datetime, 
    users.last_action, 
    users.last_action_description, 
    users.is_banned, 
    COUNT(questions_answered.question_id), 
    COUNT(questions.questioner_id) 
FROM 
    `users` 
LEFT JOIN 
    `questions` 
ON 
users.id = questions.questioner_id 
LEFT JOIN 
    `questions_answered` 
ON 
    users.id = questions_answered.user_id 
GROUP BY 
    users.id, 
    users.username, 
    users.avatar_location, 
    users.datetime, 
    users.last_action, 
    users.last_action_description, 
    users.is_banned 
ORDER BY 
    datetime 
    ASC 

只是非常感謝你的幫助!

+0

首先,爲什麼'COUNT(questions.questioner_id)'?它不可能是正確的! – Mehdi

回答

1

對於第一部分(兩個表)

我有我的查詢字符串評論:

SELECT 
    users.id, 
    users.username, 
    users.avatar_location, 
    users.datetime, 
    users.last_action, 
    users.last_action_description, 
    users.is_banned, 
    COUNT(questions.id) as number_of_questions #count each question 
FROM 
    `users` 
LEFT JOIN 
    `questions` 
ON 
    users.id = questions.questioner_id 
GROUP BY 
    users.id # you need to have unique user id in each row 
ORDER BY 
    questions.datetime # sort by question date right? 
    DESC 

對於更新(三張桌子):

您需要嵌套選擇,您不能同時在兩列執行計數。我們將第一個選擇爲users_questions_count,就像一張桌子一樣,然後每一樣東西都和兩張桌子一樣。越野車部分可能會出現名稱上的歧義。

SELECT 
    users_questions_count.id, 
    users_questions_count.username, 
    users_questions_count.avatar_location, 
    users_questions_count.datetime, 
    users_questions_count.last_action, 
    users_questions_count.last_action_description, 
    users_questions_count.is_banned, 
    users_questions_count.number_of_questions, 
    COUNT(questions_answered.id) as number_of_answers # make sure you are counting the correct field! 
FROM 
    (SELECT 
     users.id as id, 
     users.username as username, 
     users.avatar_location as avatar_location, 
     users.datetime as datetime, 
     users.last_action as last_action, 
     users.last_action_description as last_action_description, 
     users.is_banned as is_banned, 
     COUNT(questions.id) as number_of_questions #count each question 
    FROM 
     `users` 
    LEFT JOIN 
     `questions` 
    ON 
     users.id = questions.questioner_id 
    GROUP BY 
     users.id 
    ) as users_questions_count 
LEFT JOIN 
    `questions_answered` 
ON 
    users_questions_count.id = questions_answered.user_id 
GROUP BY 
    users_questions_count.id 

三個表(table1table2table3加盟上table1.idtable2.item_idtable3.item_id)總體思路:

SELECT 
    table1_table2_count.id, 
    table1_table2_count.counter_1, 
    COUNT(table3.id) as counter_2 
FROM 
    (SELECT 
     table1.id as id, 
     COUNT(table2.id) as counter_1 
    FROM 
     `table1` 
    LEFT JOIN 
     `table2` 
    ON 
     table1.id = table2.item_id 
    GROUP BY 
     table1.id 
    ) as table1_table2_count 
LEFT JOIN 
    `table3` 
ON 
    table1_table2_count.id = table3.item_id 
GROUP BY 
    table1_table2_count.id 

但它會更好,找到一個解決方案,以避免這些種類的選擇的在實際上巨大的數據。如果您可以更新一個表格並將counter_1counter_2放在上面,寫入過程將變得更慢,但讀取(搜索)會更快。

+0

非常感謝Mehdi!真的很感激它:)也許你能夠幫助我在這篇文章中的另一個編輯? :) –

+0

你是一個絕對的天才!非常感謝,Mehdi!真的非常感謝你的幫助。再次感謝! –

+0

@JackNicholsonn不客氣! :d – Mehdi

1

添加GROUP BY到您的查詢:

SELECT 
    users.id, 
    users.username, 
    users.avatar_location, 
    users.datetime, 
    users.last_action, 
    users.last_action_description, 
    users.is_banned, 
    COUNT(questions.questioner_id) 
FROM 
    `users` 
LEFT JOIN 
    `questions` 
ON 
    users.id = questions.questioner_id 
GROUP BY 
    users.id, 
    users.username, 
    users.avatar_location, 
    users.datetime, 
    users.last_action, 
    users.last_action_description, 
    users.is_banned 
ORDER BY 
    datetime 
    ASC 
+0

非常感謝Nicolai!有效!如果您有時間再次幫助第三張桌子,我已經增加了一點點。 –