2014-10-21 5 views
0

Я пытаюсь объединить 3 таблицы в инструкцию select, но подсчитываю вхождения одного, пока все еще показываю запись, если не происходит никаких событий.SQL Присоединиться, чтобы включить значения NULL

Мой пример можно увидеть в быстром sqlFiddle, который я собрал вместе. Я пытался использовать левые соединения, но это не дает результат, который я хочу.

http://sqlfiddle.com/#!6/e2840/8

Это SQL заявление:

SELECT O.OptionID,O.OptionName, Count(A.OptionID) AS Total 
FROM Options as O 
    LEFT JOIN Answers AS A ON O.OptionID = A.OptionID 
    LEFT JOIN Users as U ON A.UserId = U.UserID 
WHERE A.QuestionID = 1 
GROUP BY O.OptionID,O.OptionName 

То, что я хочу, чтобы вернуть это все строки из таблицы параметров и отображения в общей колонке 0, если нет ответов не были найдены это опция.

Какого ток возвращается скрипка:

1

Что я хотел бы, чтобы вернуться:

2

+0

Почему никто не указал, что Пользователи не нужны? –

+0

Вы правы, это не нужно в этом примере, но я включил его, потому что на моей реальной жизненной проблеме это важно. – Aki

ответ

2

подвыбор Ответ:

SELECT O.OptionID,O.OptionName, Count(A.OptionID) AS Total 
FROM Options as O 
LEFT JOIN 
(
    SELECT OPTIONID,USERID 
    FROM Answers WHERE QuestionID = 1 
) AS A ON O.OptionID = A.OptionID 
LEFT JOIN Users as U ON A.UserId = U.UserID 
GROUP BY O.OptionID,O.OptionName 
+0

Отлично, спасибо! :) – Aki

2

Вы используете ИНЕКЕ с LEFT JOIN, который делает его действовать как INNER JOIN.

Попробуйте это:

SELECT O.OptionID, O.OptionName, Count(A.OptionID) AS Total 
FROM Options as O 
    LEFT JOIN Answers AS A ON O.OptionID = A.OptionID 
    and A.QuestionID = 1 
    LEFT JOIN Users as U ON A.UserId = U.UserID 
GROUP BY O.OptionID,O.OptionName 
+0

Это работает, но у меня есть 200 миллионов записей в таблице ответов, предложение where имеет важное значение для запуска индекса. Выполняя это по-своему, он фактически не загружается в живой базе данных. Как я могу обойти это? Благодаря! – Aki

+1

Используйте подзапрос, замените «ответы как A» на '(SELECT OPTIONID, USERID FROM Answers WHERE QuestionID = 1) AS A' – mjsqu

0

Попробуйте некоторые вещи, как ниже ...

 SELECT O.OptionID,O.OptionName, Count(A.OptionID) AS Total 
     FROM Options as O 
     LEFT JOIN Answers AS A ON O.OptionID = A.OptionID and A.questionId=1 
     LEFT JOIN Users as U ON A.UserId = U.UserID 
     GROUP BY O.OptionID,O.OptionName 
0

таблица Th Пользователи не ссылается, и это совпадает с ожидаемый результат, используя данные на вашем sqlfiddle.

SELECT O.OptionID,O.OptionName, Count(A.OptionID) AS Total 
FROM Options as O 
    LEFT JOIN Answers AS A ON O.OptionID = A.OptionID 
          AND A.QuestionID = 1 
GROUP BY O.OptionID,O.OptionName 

К слову: Вы не получаете никакого преимущества, используя подзапрос. Добавленное условие соединения выполняет точно такую ​​же работу.

Но вы получите преимущество, избегая избыточного соединения.

0

такой же, как @mjsqu, но избегать подмножества. Это более лучший способ соединения без подмножеств

SELECT O.OptionID,O.OptionName, Count(A.OptionID) AS Total 
FROM Options as O 
    LEFT JOIN Answers AS A ON O.OptionID = A.OptionID and A.QuestionID = 1 
    LEFT JOIN Users as U ON A.UserId = U.UserID 
GROUP BY O.OptionID,O.OptionName 
Смежные вопросы