Kompleks (imsi) SQL sorgu katılmak ve saymak

4 Cevap php

I'm trying to create a simple poll function using php and sql. I have three tables:

Questions

Sadece sorulan her soruyu içeren

question_id | QUESTION_TEXT | created_at

Answers

Her soru için her bir cevabı içeren

question_id | answer_id | answer_text

Answered Questions

Hangi Her seçenek için oy var kayıtları

question_id | answer_id | user_ip

Ben tüm bu sorunun olası yanıtları ve nihayet her soruya her cevabın bir sayı ile birlikte tek bir soru (en son) döndüren bir sorgu yazmaya çalışıyorum. Ben JOIN yan tümcesi ve olası SOL DIŞ GROUP BY kullanmak zorunda olacak biliyorum, ama tam sözdizimi atm beni eluding olduğunu.

Herhangi bir tavsiye büyük mutluluk duyacağız. Teşekkürler.

4 Cevap

Bu sorgu en DBMSs çalışması gerekir:

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

Bu makalede mantığı çok benzer http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/.

Esasen sen ilgilenen kayıtla ilgili bilgileri seçmek için tek bir kayıt / soruyu ilgileniyorsunuz yanı sıra bir dış sorgusu seçer bir alt sorgu gerekir

(Ben zaten yayınlanmıştır güzel koleksiyonuna eklemek için başka bir SQL deyimi sonrası olabilir, ama ben diğer yayınlanmıştır sorguları nasıl çalışır üzerine denemek ve biraz ışık tutacak diye düşündüm)

Eğer materyallar varsayarsak 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
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

(Ben bunu test edilmemiş olmasına rağmen) çalışmalıdır.