2013-08-27 4 views
-1

У меня есть две таблицы для вопросника множественного выбора (каждый пользователь отвечает на ряд вопросов):MySQL вложенные Анд и несколько условий

users (userID, name, email) 

votes (voteID, userID, questionID, answerID) 

Примеры данных (пользователей):

0, Some Name, [email protected] 
1, Other Name, [email protected] 

Примеры данных (голосов):

0, 1, 1, 1 
1, 1, 2, 2 
2, 1, 3, 2 

Я хотел бы выбрать всех пользователей, у которых есть правильные ответы.

Я попробовал это (где я жёстко ответы в):

$sql = "SELECT users.userID, users.name, users.email FROM users 
INNER JOIN votes ON (users.userID = votes.userID) 
WHERE (votes.questionID = '1' AND votes.answerID = '1') 
AND (votes.questionID = '2' AND votes.answerID = '2') 
AND (votes.questionID = '3' AND votes.answerID = '2') 
AND (votes.questionID = '4' AND votes.answerID = '3') 
AND (votes.questionID = '5' AND votes.answerID = '1') 
GROUP BY users.userID"; 

Но это ничего не возвращает.

Я также пытался что-то вроде этого (где я также жёстко ответы в):

$sql = "SELECT users.userID, users.name, users.email FROM users 
INNER JOIN transfertipsvotes ON (users.userID = transfertipsvotes.userID) 
WHERE (transfertipsvotes.questionID = '1' AND transfertipsvotes.answerID = '1') GROUP BY users.userID 
UNION 
SELECT users.userID, users.name, users.email FROM users 
INNER JOIN transfertipsvotes ON (users.userID = transfertipsvotes.userID) 
WHERE (transfertipsvotes.questionID = '2' AND transfertipsvotes.answerID = '2') GROUP BY users.userID 
UNION 
SELECT users.userID, users.name, users.email FROM users 
INNER JOIN transfertipsvotes ON (users.userID = transfertipsvotes.userID) 
WHERE (transfertipsvotes.questionID = '3' AND transfertipsvotes.answerID = '2') GROUP BY users.userID"; 

Но это просто возвращает всех пользователей с один правильный ответ.

Как мне сделать правильный запрос, чтобы выбрать всех пользователей с правильными ответами?

+2

В какой колонке указано, правильный ответ или нет? и как? – 7alhashmi

+0

Я распечатываю user.userID, users.name и users.email. –

ответ

0

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

INNER JOIN votes AS q1 ON (users.userID = q1.userID) AND q1.questionID = '1' AND q1.answerID ='1' 

Повторите эту процедуру для каждого вопроса, и вы можете проверить его.

+0

Это может работать для одного или двух внутренних объединений, но если вы достигаете трех или более, это требует возраста и, в конечном итоге, истекает. –

0

Если я правильно понял вас, вы хотите, чтобы пользователи, которые ответили на все вопросы правильно. В этом случае вы должны использовать INTERSECT вместо UNION

Но для этого вы попадаете на стол столько раз, сколько задаете ваши вопросы. Лучше использовать предложение OR где "((question1 и Answer1) или (question2 и Answer2))". и, наконец, сделать группу на основе userid и получить счет правильного ответа и получить только те члены, у которых есть правильный ответ.

+0

Вы правы о своих намерениях - но это не работает с INTERSECT вместо UNION. Я предпочел бы ваше второе предложение, но я не могу понять, как будет выглядеть запрос. –

+0

выберите * от пользователей, где userid в (выберите userid из qusetions где (qusetion1 и answer1) или (qusetion2 и answer2) или .. group by userid со счетом (qusetionid) = ) –

+0

Спасибо за попытку, Mani, но я мог бы Не получив ваш запрос, я переписал его с помощью правильных таблиц, но все равно ничего. –

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