2017-05-30 46 views
-1

我有一個MySQL數據庫,包含表'人員','問題'和'答案'。我試圖得到一些易讀的結果。 我有這個疑問:我可以對這些MySQL查詢做些什麼小的調整來獲得我需要的結果?

SELECT CONCAT(people.firstName, ' ', people.lastName) as Name, 
people.emailAddress, 
(CASE questions.fruit 
    WHEN 'apple' THEN 'YES' 
    ELSE '' 
END) as Apple, 
(CASE questions.fruit 
    WHEN 'orange' THEN 'YES' 
    ELSE '' 
END) as Orange, 
(CASE questions.fruit 
    WHEN 'banana' THEN 'YES' 
    ELSE '' 
END) as Banana 
From answers 
Join questions ON answers.fruitID = questions.fruitID 
JOIN people ON questions.person = people.person 
WHERE questions.questionnaire = '24' 
ORDER BY people.person 

將會產生這樣的結果:

+------------------+--------------------+-------+--------+--------+ 
    |  Name  | emailAddress | Apple | Orange | Banana | 
    +------------------+--------------------+-------+--------+--------+ 
    | Harry Potter  | [email protected] | YES |  |  | 
    | Harry Potter  | [email protected] | YES |  |  | 
    | Harry Potter  | [email protected] | YES |  |  | 
    | Ron Weasley  | [email protected] | YES |  |  | 
    | Hermione Granger | [email protected] | YES | YES |  | 
    | Hermione Granger | [email protected] | YES |  |  | 
    | Hermione Granger | [email protected] | YES |  |  | 
    | Severus Snape | [email protected] | YES | YES |  | 
    | Remus Lupin  | [email protected] | YES |  |  | 
    | Viktor Krum  | [email protected] | YES |  |  | 
    | Molly Weasley | [email protected] | YES | YES |  | 
    | Oliver Wood  | [email protected] | YES |  |  | 
    | Oliver Wood  | [email protected] |  |  | YES | 
    +------------------+--------------------+-------+--------+--------+ 

這是偉大的。它具有我需要的所有信息,但是,如果每人只有一行,並且他們選擇了所有的果實(即使他們多次回答),那麼這將是理想選擇。我無法弄清楚如何讓團隊做我想做的事。像這樣:

+------------------+--------------------+-------+--------+--------+ 
|  Name  | emailAddress | Apple | Orange | Banana | 
+------------------+--------------------+-------+--------+--------+ 
| Harry Potter  | [email protected] | YES |  |  | 
| Ron Weasley  | [email protected] | YES |  |  | 
| Hermione Granger | [email protected] | YES | YES |  | 
| Severus Snape | [email protected] | YES | YES |  | 
| Remus Lupin  | [email protected] | YES |  |  | 
| Viktor Krum  | [email protected] | YES |  |  | 
| Molly Weasley | [email protected] | YES | YES |  | 
| Oliver Wood  | [email protected] | YES |  | YES | 
+------------------+--------------------+-------+--------+--------+ 

所以上面的預期結果會忽略同一水果的多個答案。但是,在某些情況下,我想知道是否有人多次用相同的水果回答。所以,我也得到了該查詢:

SELECT CONCAT(people.firstName, ' ', people.lastName) as Name, 
people.emailAddress, 
SUM(CASE questions.fruit 
    WHEN 'apple' THEN 1 
    ELSE 0 
END) as 'AppleCount', 
SUM(CASE questions.fruit 
    WHEN 'orange' THEN 1 
    ELSE 0 
END) as 'OrangeCount', 
SUM(CASE questions.fruit 
    WHEN 'banana' THEN 1 
    ELSE 0 
END) as 'BananaCount' 
From answers 
Join questions ON answers.fruitID = questions.fruitID 
JOIN people ON questions.person = people.person 
WHERE questions.questionnaire = '24' 
GROUP BY people.person 
ORDER BY people.person 

將會產生這樣的:

+------------------+--------------------+---------+---------+--------+ 
|  Name  | emailAddress | Apple | Orange | Banana | 
+------------------+--------------------+---------+---------+--------+ 
| Harry Potter  | [email protected] | 3  | 0  | 0  | 
| Ron Weasley  | [email protected] | 1  | 0  | 0  | 
| Hermione Granger | [email protected] | 3  | 1  | 0  | 
| Severus Snape | [email protected] | 1  | 1  | 0  | 
| Remus Lupin  | [email protected] | 1  | 0  | 0  | 
| Viktor Krum  | [email protected] | 1  | 0  | 0  | 
| Molly Weasley | [email protected] | 1  | 1  | 0  | 
| Oliver Wood  | [email protected] | 1  | 0  | 1  | 
+------------------+--------------------+---------+---------+--------+ 

,這也是偉大的,但可能是一對夫婦的改善更好。首先(真正的問題)是,當一個人沒有答案但是他們確實存在於問題表中(因爲我已經發送了問卷給他們),他們完全不顯示上述查詢。我想讓他們在結果中列出,他們只是沒有選擇任何水果。其次,我希望「0」只是空白。所以它會看起來像這樣:

+------------------+--------------------+---------+---------+--------+ 
|  Name  | emailAddress | Apple | Orange | Banana | 
+------------------+--------------------+---------+---------+--------+ 
| Harry Potter  | [email protected] | 3  |   |  | 
| Ron Weasley  | [email protected] | 1  |   |  | 
| Hermione Granger | [email protected] | 3  | 1  |  | 
| Severus Snape | [email protected] | 1  | 1  |  | 
| Remus Lupin  | [email protected] | 1  |   |  | 
| Viktor Krum  | [email protected] | 1  |   |  | 
| Molly Weasley | [email protected] | 1  | 1  |  | 
| Oliver Wood  | [email protected] | 1  |   | 1  | 
| Argus Filch  | [email protected] |   |   |  | 
+------------------+--------------------+---------+---------+--------+ 

有關如何獲得這兩個理想結果的任何想法?

編輯:工作樣本數據...

+0

將連接更改爲左連接 – artm

+0

考慮處理應用程序代碼 – Strawberry

+0

中的數據顯示問題請編輯您的問題並顯示涉及的所有表的示例數據。 –

回答

0

我覺得樞軸查詢可以給你想要的輸出。在下面的查詢I GROUP BY中連接的名稱和電子郵件地址。這裏的關鍵點在於我們採用MAX類似於您在原始查詢中使用的CASE表達式。

SELECT 
    CONCAT(people.firstName, ' ', people.lastName) AS Name, 
    people.emailAddress, 
    MAX(CASE WHEN questions.fruit = 'apple' THEN 'YES' END) AS Apple, 
    MAX(CASE WHEN questions.fruit = 'orange' THEN 'YES' END) AS Orange, 
    MAX(CASE WHEN questions.fruit = 'banana' THEN 'YES' END) AS Banana 
FROM answers 
LEFT JOIN questions 
    ON answers.fruitID = questions.fruitID 
LEFT JOIN people 
    ON questions.person = people.person AND 
     questions.questionnaire = '24' 
GROUP BY 
    CONCAT(people.firstName, ' ', people.lastName), -- not ANSI compliant, but should 
    people.emailAddress        -- work with MySQL 
ORDER BY Name 

請注意,我不知道你爲什麼加入answers表。如果你已經包含了一些樣本數據,也許這是顯而易見的。

如果你想,而不是得到計數每個水果的,那麼你可以與查詢的其餘部分相同使用以下SELECT

SELECT 
    CONCAT(people.firstName, ' ', people.lastName) AS Name, 
    people.emailAddress, 
    SUM(CASE WHEN questions.fruit = 'apple' THEN 1 ELSE 0 END) AS Apple, 
    SUM(CASE WHEN questions.fruit = 'orange' THEN 1 ELSE 0 END) AS Orange, 
    SUM(CASE WHEN questions.fruit = 'banana' THEN 1 ELSE 0 END) AS Banana 
+0

你的第一個解決方案解決了我每人有多行的問題,謝謝!但是,對於在答案表中沒有記錄但存在於問題表中的人員(因爲我向他們發送了他們還沒有回答的問卷),您的任何解決方案都不會返回一行。基本上,你的第二個解決方案產生與第二個解決方案完全相同的結果。如果有幫助,我會嘗試用一些示例數據編輯我的問題。 –

+0

@JustaSecUser我將'WHERE'條件移到了'ON'子句。請再次嘗試我的第一個查詢,謝謝。 –

+0

編輯似乎可能取得了一些進展。現在,我得到一個NULL和NULL的名稱和電子郵件地址的人沒有答案,但我也得到一個「是」的所有水果爲NULL人。我仍然試圖將可讀的格式示例表編輯到我的問題中。我知道你的位置很難猜測。 –

0
SELECT CONCAT(people.firstName, ' ', people.lastName) as Name, 
people.emailAddress, 
sum((CASE questions.fruit 
    WHEN 'apple' THEN 1 
    ELSE NULL 
END)) as Apple, 
sum((CASE questions.fruit 
    WHEN 'orange' THEN 1 
    ELSE NULL 
END)) as Orange, 
sum((CASE questions.fruit 
    WHEN 'banana' THEN 1 
    ELSE NULL 
END)) as Banana 
From people 
LEFT JOIN ON questions questions.person = people.person 
LEFT Join answers ON answers.fruitID = questions.fruitID 
WHERE questions.questionnaire = '24' 
GROUP BY CONCAT(people.firstName, ' ', people.lastName), people.emailAddress 
ORDER BY name, people.emailAddress 
+0

它會有多條記錄而不總結。如果我們把它像這樣@scaisEdge –

+0

只是想讓你知道我已經試過這個,我正在研究它爲什麼不起作用。我得到的所有回報都是一行(1人),所有人的所有答案都加在一起。試圖找出爲什麼發生這種情況... –

+0

@JustaSecUser如果你只是一個檢查組的行..我已經用一個明確的組更新答案..無論如何 – scaisEdge

0

你應該使用左連接,而不是加入得到沒有任何答案的阿古斯。並把子查詢,使0空白,因爲總和結果永遠不會是空白的。

SELECT Name, CASE WHEN AppleCount = 0 THEN '' ELSE AppleCount END, 
CASE WHEN OrangeCount= 0 THEN '' ELSE OrangeCount END, 
CASE WHEN BananaCount= 0 THEN '' ELSE BananaCount END FROM (
    SELECT CONCAT(people.firstName, ' ', people.lastName) as Name, 
    people.emailAddress, 
    SUM(CASE questions.fruit 
    WHEN 'apple' THEN 1 
    ELSE 0 
    END) as 'AppleCount', 
    SUM(CASE questions.fruit 
    WHEN 'orange' THEN 1 
    ELSE 0 
    END) as 'OrangeCount', 
    SUM(CASE questions.fruit 
    WHEN 'banana' THEN 1 
    ELSE 0 
    END) as 'BananaCount' 
    From people 
    LEFT JOIN ON answers questions.person = people.person 
    LEFT JOIN questions ON answers.fruitID = campaign.fruitID 
    WHERE questions.questionnaire = '24' 
    GROUP BY people.person 
    ORDER BY people.person) TableA 

糟糕,因爲你想顯示的人民應該是在頂部,而不是在答案表。

+0

這很接近。我現在正在讓人們看到結果並且沒有答案,但是,對於應該爲「0」或空白的所有內容,我都會得到「1」。例如,尚未回答調查問卷的人顯示1爲蘋果,1爲橙色,1爲香蕉。其他計數是正確的(例如,當一個人有5個「蘋果」的答案例如) –

+0

正確它應該是0或空白,因爲你的'questions.fruit'應該爲空。嘗試將「AND」條件設置爲CASE WHERE questions.fruit不爲null並且questions.fruit ='apple'then 1 else 0 –

相關問題