2009-07-29 54 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 

應該工作(雖然我沒有測試過)。