Как использовать один запрос для двух таблиц, представляющих опрос с несколькими ответами? - PullRequest
0 голосов
/ 01 апреля 2009

У меня есть две таблицы poll и poll_answers , которые представляют опрос и варианты на выбор, чтобы ответить на вопрос из опроса. EX:

Я плохо разбираюсь в SQL?

  • да
  • да, вы делаете
  • изменить ремесло

и соответствующие таблицы:

Опрос

pollID pollQuestion

 1 | Am I poor at SQL?

poll_answers

pollAnswerID pollAnswerText pollID

  1 | yes | 1

  2 | yes, you do | 1

  3 | change craft | 1

и вот как я получаю данные:

$polls=$db->get_results("SELECT pollID, pollQuestion FROM poll",ARRAY_A);
    foreach ($polls as $poll_field)
    {
        $poll['id']=$poll_field['pollID'];
        $poll['question']=$poll_field['pollQuestion'];
        $tmp=$poll['id'];
        //answers
        $answers=$db->get_results("SELECT pollAnswerID, pollAnswerText FROM poll_answers WHERE pollID='$tmp'",ARRAY_A);
            {
            //and so on , I think you get the idea.
            }


    }

Мне это кажется очень неуклюжим, поскольку я думаю, что можно получить данные только одним SQL-запросом, используя INNER JOIN для совпадения идентификатора ... Я просто не смог этого сделать. Вы можете помочь? Имейте в виду, что в моей базе данных есть несколько опросов.


Редактировать: спасибо за ответы до сих пор. Я ценю помощь. Но я плохо объяснил вопрос. Можно ли получить все опросы со всеми ответами в массиве или объекте, используя только один SELECT. В ответах вы использовали переменную $tmp, которая уже взята из предыдущего запроса. Так можно ли это сделать или я не получаю ответы?

Ответы [ 3 ]

5 голосов
/ 01 апреля 2009
SELECT pollQuestion, pollAnswerID, pollAnswerText
FROM   poll_answers pa, poll p
WHERE  p.pollID='$tmp'
       AND pa.pollId = p.pollID

или, если вы предпочитаете INNER JOIN синтаксис,

SELECT pollQuestion, pollAnswerID, pollAnswerText
FROM   poll p
INNER JOIN
       poll_answers pa
ON     pa.pollId = p.pollID
WHERE  p.pollID='$tmp'

Чтобы получить что-либо в массиве, вы используете:

SELECT  -1, pollQuestion
FROM    poll p
WHERE   p.pollID = @pollID
UNION ALL
SELECT  pollAnswerID, pollAnswerText
FROM    poll_answers pa
WHERE   pa.pollID= @pollID
1 голос
/ 01 апреля 2009

Вы хотите получить ответы на все вопросы? Просто удалите ограничение pollID:

ВЫБРАТЬ p.pollID p.pollQuestion, pa.pollAnswerID, pa.pollAnswerText FROM poll p, poll_answers pa ГДЕ pa.pollID = p.pollID

1 голос
/ 01 апреля 2009
SELECT polls.pollID, answers.pollAnswerID, answers.pollAnswerText 
FROM poll polls
LEFT JOIN poll_anwers answers ON polls.pollID = answers.pollID
WHERE polls.pollID = " . (int) $pollId . "
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...