2009-07-29 77 views
2

我想创建一个简单的使用php和sql的轮询函数。 我有三个表:复杂(ish)SQL连接和计数查询

问题

其中只包含每一个问题问

question_id | question_text | created_at

答案

它包含每个回答每个问题

question_id | answer_id | ANSWER_TEXT

答复的问题

它记录谁投了赞成票每个选项

question_id | answer_id | user_ip

我想写一个查询,它将返回一个问题(最近的)以及所有可能的问题答案,并最终计算每个问题的每个答案。我知道我将不得不使用GROUP BY子句和可能的左外连接,但确切的语法是逃避我atm。

任何意见将不胜感激。谢谢。

+0

为什么在第三个表中保留`question_id`? `question_id`由`answer_id`定义。 – Quassnoi 2009-07-29 10:39:59

+0

@Quassnoi:除非他的主键是合成的(question_id,answer_id)。 – 2009-07-29 10:45:37

+0

@Hosam Aly:你认为一个答案可以应用于多个问题? – Quassnoi 2009-07-29 10:59:13

回答

1

此查询应该在大多数DBMS的工作:

select q.question_id, question_text, a.answer_id, a.answer_text, count(user_ip) 
    from questions q 
inner join answers a on (q.question_id = a.question_id) 
    left join answered_questions aq on (a.question_id = aq.question_id 
             and a.answer_id = aq.answer_id) 
where created_at = (select max(created_at) 
         from questions 
        ) 
group by q.question_id, a.answer_id, q.question_text, a.answer_text 
1

假设你usnig MySQL

SELECT q.* , 
     (
     SELECT COUNT(*) 
     FROM answered_questions aq 
     WHERE aq.answer_id = a.answer_id 
       AND aq.question_id = q.question_id 
     ) AS votes 
FROM (
     SELECT * 
     FROM question 
     ORDER BY 
       created_at DESC 
     LIMIT 1 
     ) q 
LEFT OUTER JOIN 
     answers a 
ON  a.question_id = q.question_id 
0
SELECT 
    questions.question_id, 
    questions.question_text, 
    answers.answer_id, 
    answers.answer_text, 
    COUNT(answered_questions.user_ip) 
FROM 
    questions,answers, 
    answered_questions 
WHERE 
    questions.question_id=answers.question_id 
    AND 
    questions.question_id= 
     (SELECT 
      question_id 
      FROM questions 
      ORDER BY questions.created_at 
      LIMIT 1 
     ) 
    AND 
    answered_questions.question_id=questions.question_id 
GROUP BY 
    questions.question_id 

应该工作(虽然我没有测试过)。