2015-09-25 74 views
1

1列多列我有兩個表,即tbl_votes和tbl_candidates:如何選擇與計數

tbl_votes:包含FF柱:

voteID president vicePresident secretary treasurer rep1 rep2  rep3 
1    1    3          9  12  15 
2    1    4    6   8   12  15 
3    2    3    5   7   9  12 

而tbl_candidates包含FF柱:

idcandidate fName   mName   lName   position 
1   Jefferson  Garcia  Roxas   president 
2   Carlson  Mcvoy   Zafiro  president 
3   Andrew  Efron   Anderson  vice president 
4   Jessica  Garcia  Roxas   secretary 

...

9   Jayson  Sanchez  Dela Cruz  representative 
10   Arille Alisa Villanueva Valdez   representative 
11   Arnold  Castro  Baltazar  representative 
12   Kristina  de Leon  Guillermo  representative 
13   Jayson  Jones   Dela Cruz  representative 
14   Karla   Santos  Abrogena  representative 
15   Jason      Chua   representative 

查詢,我想的是:

Name              votes 
Jefferson Garcia Roxas          2 
Carlson Mcvoy Zafiro           1 
Andrew Efron Anderson          2 
Jessica Garcia Roxas           1 

...

Jayson Sanchez Dela Cruz          2 
Arnold Castro Baltazar          0 
Kristina de Leon Guillermo         3 
Jason Chua             2 

我堅持到哪裏算選票,這裏是我的代碼:

SELECT `Name`, Votes 
FROM (SELECT COUNT(*) as Votes FROM tbl_votes) a 
CROSS JOIN (Select (Concat(fName ,' ',mName,' ', lName)) as `Name` from tbl_candidates) b; 

的查詢結果爲:

Name              Votes 
Jefferson Garcia Roxas          3 
Carlson Mcvoy Zafiro           3 
Andrew Efron Anderson          3 
Jessica Garcia Roxas           3 
Jayson Sanchez Dela Cruz          3 
Arnold Castro Baltazar          3 
Kristina de Leon Guillermo         3 
Jason Chua             3 

我如何使特定於idcandidate的計數? 您的巨大幫助將不勝感激。謝謝!

+0

@Julio蘇亞雷斯你有任何意見或建議我將如何解決我的問題? –

+0

我的確...我正努力在一秒內回答 –

回答

1
SELECT fName||' '||mName||' '||lName, votes FROM (
SELECT a.idcandidate, COUNT(b.idcandidate) votes 
FROM tbl_candidates a 
LEFT JOIN (
SELECT president idcandidate from tbl_votes 
UNION ALL 
SELECT vicePresident idcandidate from tbl_votes 
UNION ALL 
SELECT secretary idcandidate from tbl_votes 
UNION ALL 
SELECT treasurer idcandidate from tbl_votes 
UNION ALL 
SELECT rep1 idcandidate from tbl_votes 
UNION ALL 
SELECT rep2 idcandidate from tbl_votes 
UNION ALL 
SELECT rep3 idcandidate from tbl_votes) b 
ON (a.idcandidate = b.idcandidate) 
GROUP BY a.idcandidate) tab 
JOIN tbl_candidates b on (b.idcandidate = tab.idcandidate) 

上面的答案是SQLite,我不知何故誤讀了這個問題上的標籤。

但是它可能工作,除了第一行就需要在MySQL的格式:

SELECT CONCAT_WS(" ", fName, mName, lName), votes FROM (
+0

您的代碼有效,它還顯示沒有投票的候選人。感謝您的大力幫助! –

2

而你可能CROSS JOIN方法,這(但不同於您提出)和適當的聚集的結果,這是一個不好的方法,不能很好地擴展。當然,當你揹負着一個糟糕的數據模型時,並沒有真正的好方法,就像你一樣。

有幾種方法可以解決這個,他們沒有特別好,比如:

SELECT `Name`, COUNT(*) AS `votes` 
FROM 
(
    SELECT 
    CONCAT(fName, ' ', mName, ' ', lName) as `Name` 
    FROM 
    tbl_candidates c 
    JOIN tbl_votes v 
     ON c.idcandidate = v.president 
    WHERE 
    c.position = 'president' 

    UNION ALL 

    SELECT 
    CONCAT(fName, ' ', mName, ' ', lName) as `Name` 
    FROM 
    tbl_candidates c 
    JOIN tbl_votes v 
     ON c.idcandidate = v.vicePresident 
    WHERE 
    c.position = 'vice president' 

    UNION ALL 

    SELECT 
    CONCAT(fName, ' ', mName, ' ', lName) as `Name` 
    FROM 
    tbl_candidates c 
    JOIN tbl_votes v 
     ON c.idcandidate IN (v.rep1, v.rep2, v.rep3) 
    WHERE 
    c.position = 'representative' 
) vote_agg 
GROUP BY `Name` 

,打破了由位置的問題,用一個內嵌視圖每個位置生成每個投行爲該位置的每個候選人。然後通過UNION ALL將它們組合成一個整體列表,並對結果執行彙總查詢以計算每個候選人的投票數。

如果現有候選人對於他們沒有參加競選的職位(在指定的數據模型中很難或不可能通過約束來阻止)進行投票,那麼這些職位將被忽略。如果任何一次投票對同一代表候選人有超過一票的投票,那麼只有一個投票將被計算(可能是期望的行爲,也可能不是)。

+0

Bolinger非常感謝您的回答!我能夠快速分析你的答案。我以我想要的方式得到我的查詢 –

0

你有你的模型問題......一旦你解決這些查詢將是非常簡單的創建。

Minimaly ...:

我會創建一個職位表,以便我可以直接與候選人聯繫。

positons_table 
id  position 
1  president 
2  vice-president 
3  secretary 
4  .... 

然後考生表...

idcandidate fName   mName   lName   position 
1   Jefferson  Garcia  Roxas   1 
2   Carlson  Mcvoy   Zafiro  1 
3   Andrew  Efron   Anderson  2 
4   Jessica  Garcia  Roxas   3 

然後,如果你不想改變你的tbl_votes ...

票數爲總統:

SELECT CONCAT(c.fName, " ", c.mName, " ", c.lName) as Name, count(v.president) as votes 
FROM tbl_votes v 
INNER_JOIN tbl_candidates c on v.president = c.idcandidate GROUP BY v.president 

投票副主席

SELECT CONCAT(c.fName, " ", c.mName, " ", c.lName) as Name, count(v.vicePresident) as votes 
FROM tbl_votes v 
INNER_JOIN tbl_candidates c on v.vicePresident = c.idcandidate GROUP BY v.vicePresident 

等等... 如果需要一起總結...

SELECT CONCAT(c.fName, " ", c.mName, " ", c.lName) as Name, count(v.president) as votes 
FROM tbl_votes v 
INNER_JOIN tbl_candidates c on v.president = c.idcandidate GROUP BY v.president 

UNION 

SELECT CONCAT(c.fName, " ", c.mName, " ", c.lName) as Name, count(v.vicePresident) as votes 
FROM tbl_votes v 
INNER_JOIN tbl_candidates c on v.vicePresident = c.idcandidate GROUP BY v.vicePresident 

UNION .... 
+1

我認爲你的意思是'c.idcandidate'在那些查詢中。 OP的候選版本的版本和您的「id」列都不是。 –

+0

@JohnBollinger你是對的。沒有測試...只是想展示道路...... –