MySQL запрос

LEXAlForpostl

Мой дом здесь!
Регистрация
21 Май 2008
Сообщения
766
Реакции
228
Здравствуйте.
Пытаюсь выполнить mysql запрос:
PHP:
SELECT `person_id`
FROM `answers`
WHERE `variant_id` = (
SELECT `id`
FROM `variants`
WHERE `quest_id` = (
SELECT `id`
FROM `questions`
WHERE `test_id` =1 ) ) group by `person_id`
Выдаёт ошибку:
#1242 - Subquery returns more than 1 row
Перевод я понимаю. Но как сделать по-другому - не знаю.
Это БД, которая хранит анкету в себе.
Таблицы: tests (id,name), questions (id,name,test_id,list_id - какой номер вопроса в анкете), variants (id,name,quest_id), answers (id,name,person_id - номер обработанной анкеты,variant_id)

Вопрос, как получить список анкет, которые отвечали на test с id =1.
 
limit 1 пропиши
а лучше разбей на маленькие запросы
 
Мне лимит не нужен?
Мне нужна все вопросы, все ответы по данному тесту.
 
#1242 - Subquery returns more than 1 row - для того что бы избежать этого - лимит

а по правильному - переписать на маленькие запросы или использовать JOIN

типа

SELECT `person_id`
FROM `answers`
LEFT JOIN `variants` ON `variant_id` = ..
LEFT JOIN `questions` ON `id` = ...
WHERE `test_id` = 1
GROUP BY `person_id`
 
Мне лимит не нужен?
Мне нужна все вопросы, все ответы по данному тесту.

в ответ приходит сообщение, что внутрении запросы возвращают больше 1 строки и вы сравниваете значение одного поля с нескольким значением, отсюда ошибка.... выше уже написали, что можно воспользоватся либо limit 1 для внутрених запросов - вернет первое и единственное значение удовлетворяющее условию
 
а по правильному - переписать на маленькие запросы или использовать JOIN

типа

SELECT `person_id`
FROM `answers`
LEFT JOIN `variants` ON `variant_id` = ..
LEFT JOIN `questions` ON `id` = ...
WHERE `test_id` = 1
GROUP BY `person_id`

Подскажите, пожалуйста, что вместо точек должно быть.
 
У меня всего 1 переменная - $test_id и всё.
А пропущенных мест - 2 штуки.
Напишите, пожалуйста, полностью запрос, который выполнит поставленную задачу. Буду очень признателен за помощь.
 
а что вы вообще хотите получить?
SELECT `person_id`
FROM `answers`
WHERE `variant_id` = (
SELECT `id`
FROM `variants`
WHERE `quest_id` = (
SELECT `id`
FROM `questions`
WHERE `test_id` =1 ) ) group by `person_id`
разбираем
SELECT `id`
FROM `questions`
WHERE `test_id` =1
получаем id вопроса для которого `test_id` =1 (если поле `test_id` не уникально, то получите кучу id), при использовании limit вернется первый, а он ли вам нужен????
далее
SELECT `id`
FROM `variants`
WHERE `quest_id`
тут уж точно несколько вариантов а вы сравниваете с 1 id
Вывод надо либо знать всю структуру, чтобы написать для вас запросы необходимые, либо Вам грамотно описать задачу, что вы вообще хотите получить этими запросами
через join ваши запросы как то так:
 
WHERE `variant_id` = ( SELECT

заменить на

WHERE `variant_id` IN ( SELECT

И со вторым равенством также.


Конечно, джойнами будет правильнее. Но мне кажется, что в последнем запросе psn должен быть INNER JOIN в обоих случаях
 
Назад
Сверху