MySQL запрос

Тема в разделе "Базы данных", создана пользователем LEXAlForpostl, 6 окт 2011.

Модераторы: latteo
  1. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    740
    Симпатии:
    226
    Здравствуйте.
    Пытаюсь выполнить mysql запрос:
    PHP:
    SELECT `person_id`
    FROM `answers`
    WHERE `variant_id` = (
    SELECT `id`
    FROM `variants`
    WHERE `quest_id` = (
    SELECT `id`
    FROM `questions`
    WHERE `test_id` =) ) group by `person_id`
    Выдаёт ошибку:
    Перевод я понимаю. Но как сделать по-другому - не знаю.
    Это БД, которая хранит анкету в себе.
    Таблицы: 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.
     
  2. mcdir

    mcdir

    Регистр.:
    6 ноя 2007
    Сообщения:
    202
    Симпатии:
    37
    limit 1 пропиши
    а лучше разбей на маленькие запросы
     
  3. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    740
    Симпатии:
    226
    Мне лимит не нужен?
    Мне нужна все вопросы, все ответы по данному тесту.
     
  4. mcdir

    mcdir

    Регистр.:
    6 ноя 2007
    Сообщения:
    202
    Симпатии:
    37
    #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`
     
  5. psn

    psn

    Регистр.:
    30 апр 2009
    Сообщения:
    228
    Симпатии:
    30
    в ответ приходит сообщение, что внутрении запросы возвращают больше 1 строки и вы сравниваете значение одного поля с нескольким значением, отсюда ошибка.... выше уже написали, что можно воспользоватся либо limit 1 для внутрених запросов - вернет первое и единственное значение удовлетворяющее условию
     
  6. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    740
    Симпатии:
    226
    Подскажите, пожалуйста, что вместо точек должно быть.
     
  7. vlad_v

    vlad_v

    Регистр.:
    30 июн 2006
    Сообщения:
    444
    Симпатии:
    67
    переменная в одинарных кавычках.
    например: '$variable'
     
  8. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    740
    Симпатии:
    226
    У меня всего 1 переменная - $test_id и всё.
    А пропущенных мест - 2 штуки.
    Напишите, пожалуйста, полностью запрос, который выполнит поставленную задачу. Буду очень признателен за помощь.
     
  9. psn

    psn

    Регистр.:
    30 апр 2009
    Сообщения:
    228
    Симпатии:
    30
    а что вы вообще хотите получить?
    разбираем
    получаем id вопроса для которого `test_id` =1 (если поле `test_id` не уникально, то получите кучу id), при использовании limit вернется первый, а он ли вам нужен????
    далее
    тут уж точно несколько вариантов а вы сравниваете с 1 id
    Вывод надо либо знать всю структуру, чтобы написать для вас запросы необходимые, либо Вам грамотно описать задачу, что вы вообще хотите получить этими запросами
    через join ваши запросы как то так:

    select person_id from answers left outer join variants on answers.variant_id = variants.id left outer join questions on variants.quest_id = questions.id where questions.test_id=1
     
  10. Soul :)

    Soul :) Постоялец

    Регистр.:
    22 мар 2007
    Сообщения:
    86
    Симпатии:
    9
    WHERE `variant_id` = ( SELECT

    заменить на

    WHERE `variant_id` IN ( SELECT

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


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