2013-03-07 2 views
1

До сих пор я это:Mysql условно: случай, когда и левое соединение не может заставить их работать должным образом

SELECT 
    l.logo_id, 
    l.logo_image_path, 
    l.logo_lang, 
    (1) AS answered 
FROM logos l 
WHERE l.logo_level = $level" 

Я хочу ответил показать 1, если пользователь ответил на этот вопрос, и 0, если пользователь не ответил на этот вопрос. Результаты сохраняются в таблице результатов, которая содержит r.logo_id r.user_id

Я попытался:

(CASE WHEN l.logo_id = r.logo_id THEN 1 ELSE 0 END) AS answered 

Но это не работает, то, очевидно, я недостающую таблицу результатов, и user_id проверить, как я хочу, для этого пользователя, поэтому я должен добавить где-то WHERE r.user_id = $user_data[0]['user_id']

Помогите мне с этим? а также объясняйте шаг за шагом, чтобы получить его окончательно :)

ty.

+0

Можете ли вы разместить объявление, пожалуйста? Попытка выяснить, что относится к псевдониму r table к – Kickstart

+0

. Таблица @Kickstart r - это результаты – 2013-03-07 12:48:04

ответ

0

Предполагая, что логотипы ваша таблица вопросов и результаты ваша таблица ответов, причем каждый пользователь, имеющий 0 до многих строк на результаты таблицы (по одному на каждый ответил вопрос), то что-то вроде этого: -

$sql = "SELECT 
    l.logo_id, 
    l.logo_image_path, 
    l.logo_lang, 
    CASE WHEN r.logo_id IS NULL THEN 0 ELSE 1 END AS answered 
FROM logos l 
LEFT OUTER JOIN results r 
ON l.logo_id = r.logo_id 
AND r.user_id = ".$user_data[0]['user_id']." 
WHERE l.logo_level = ".$level; 
+0

Это работает отлично. Но я не понимаю, почему ... Что меня смущает, так и r.user_id = ". $ User_data [0] ['user_id']." Я ожидаю, что этот И будет делать что-то вроде WHERE l.logo_level = ". $ Level; – 2013-03-07 12:59:33

+1

Он использует левое соединение. Проверка на r.user_id находится в предложении ON этого соединения. Таким образом, он будет объединяться только с записями на таблицу результатов для этого пользователя.Если вы проверили r.user_id в предложении WHERE, тогда он будет выполнять соединение, а THEN исключает записи, которые не были для этого идентификатора пользователя. Однако, поскольку LEFT JOIN имеет нуль в этом поле, когда не было (т. е. когда пользователь не ответил на этот вопрос), вы попали бы, исключая строки для вопроса, на которые пользовательский идентификатор не ответил. – Kickstart

+0

Понятно, спасибо! – 2013-03-07 13:04:08

0
SELECT (CASE WHEN l.logo_id = r.logo_id THEN 1 ELSE 0 END) AS answered, l.logo_id, 
    l.logo_image_path, 
    l.logo_lang FROM logos l, results r WHERE l.logo_level = $level AND ... clause to join two tables ... AND r.user_id = $user_data[0]['user_id'] 
+0

. Я не получаю то, что вы написали, но я думаю, что r.user_id = $ user_data [0] ['user_id'] должен быть условным для CASE КОГДА не весь выбор. На некоторые вопросы может не ответить, и в таблице результатов ничего не будет видно из-за этого условного ... Возможно, я ошибаюсь :) – 2013-03-07 12:49:52

+0

У меня тоже нет четкого вопроса. Возможно, было бы лучше, если бы вы могли больше узнать об атрибутах в своем вопросе :) – PCoder

+0

извините, с «Я не понимаю, что вы написали» - я имел в виду, что я мало разбираюсь в операторах mysql, поэтому я угадываю большую часть время ... – 2013-03-07 12:56:35

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