2015-09-25 2 views
1

У меня есть две таблицы, а именно tbl_votes и tbl_candidates:Как выбрать несколько столбцов с 1 столбец с кол

tbl_votes: содержит столбец ФФ:

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 содержат столбец ФФ:

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

у вас проблемы с вашей моделью ... после того, как вы обратились к этим запросам, было бы очень просто создать.

Минимально ...:

Я бы создал таблицу позиций, чтобы я мог напрямую относиться к кандидатам.

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' в этих запросах. Ни версия списка кандидатов в списке кандидатов, ни ваша колонка «id». –

+0

@JohnBollinger вы правы. Не тест ... просто тринг, чтобы показать путь ... –

Смежные вопросы