Nasıl aynı satırda birden fazla alanı seçmek için?

4 Cevap php

I asked a question yesterday bir ankete sonuçları taksitli MySQL kullanma hakkında.

Şimdi soru, I anket soruları, anket seçimler bir tablo ve bu anket soruları, nasıl aynı sorgu içinde o detaylar için tüm seçenekler ile birlikte anket sorusunu seçmek istiyorsunuz kullanıcıları cevaplar bir tablo bir tablo olsaydı ?

Sorular Tablo

question_id (int)
question (text)

Seçimleri Tablo

choice_id (int)
question_id (int)
choice_text (varchar)

Yanıtlar Tablo

answer_id (int)
question_id (int)
choice_id (int)

Ben aynı sorguda olduğu (bilinen veya bilinmeyen miktarda) detaylar için tüm seçenekler ile birlikte anket sorusunu almak SELECT ne yapmalıyım? (Mümkünse, aynı sorgu içinde, benim diğer soru bulunan matematik, do)

MySQL ile o kadar ileri değilim.

Teşekkürler

EDIT: Sorry, What I meant was, I'm trying to get a SELECT statement to select the question, and all the choices corresponding to that question, in one row.

Ben böyle bir şey yapmak

SELECT question_id, question, choice_id, choice_text FROM questions LEFT JOIN choices USING(question_id)

Birden fazla satır, her choice_id için bir tane olsun.

Sonuçlar gibi bir şey olmalı

question     choice_1  choice_2  choice_3
A or B or C     A          B        C

Matematik bölümü ankete sonuçlarını örtüşmektedir ve bu yardımcı olur, evet, choice_id, bir PK olduğunu.

4 Cevap

Her soru için soru ve seçimleri almak için:

SELECT question, choice_text
FROM questions
JOIN choices
ON questions.question_id = choices.question_id

Ayrıca hiçbir seçeneğiniz yok sorularını istiyorsanız önce KATILIN SOL ekleyin.

Bunu yapabileceğini her bir cevap için sayıları elde etmek için:

SELECT question, choice_text, COUNT(answers.choice_id)
FROM questions
JOIN choices
    ON questions.question_id = choices.question_id
LEFT JOIN answers
    ON questions.question_id = answers.question_id
    AND choices.choice_id = answers.choice_id
GROUP BY questions.question_id, choices.choice_id
ORDER BY questions.question_id, choices.choice_id

(Soru başına) bir yüzdesi aşağıdaki sorguyu kullanmak gibi her bir cevabı seçen insanların sayısını elde etmek için:

SELECT question, choice_text, COUNT(answers.choice_id) * 100 / questiontotal
FROM questions
JOIN (
        SELECT questions.question_id, COUNT(answers.choice_id) AS questiontotal
        FROM questions
        LEFT JOIN answers ON questions.question_id = answers.question_id
        GROUP BY questions.question_id
    ) AS answercounts
    ON questions.question_id = answercounts.question_id
JOIN choices ON questions.question_id = choices.question_id
LEFT JOIN answers
    ON questions.question_id = answers.question_id
    AND choices.choice_id = answers.choice_id
GROUP BY questions.question_id, choices.choice_id
ORDER BY questions.question_id, choices.choice_id;

Burada kullanılan testdata bulunuyor:

CREATE TABLE questions (question_id int, question nvarchar(100));
INSERT INTO questions (question_id, question) VALUES
(1, 'Foo?'),
(2, 'Bar?');

CREATE TABLE choices (choice_id int, question_id int, choice_text nvarchar(100));
INSERT INTO choices (choice_id, question_id, choice_text) VALUES
(1, 1, 'Foo1'),
(2, 1, 'Foo2'),
(3, 1, 'Foo3'),
(4, 2, 'Bar1'),
(5, 2, 'Bar2');

CREATE TABLE answers (answer_id int, question_id int, choice_id int);
INSERT INTO answers (answer_id, question_id, choice_id) VALUES
(1, 1, 1),
(2, 1, 1),
(3, 1, 3),
(4, 2, 4),
(4, 2, 5);

Ve ben bu verilere son sorgu ile olsun çıktı:

'Foo?', 'Foo1', 66.6667
'Foo?', 'Foo2', 0.0000
'Foo?', 'Foo3', 33.3333
'Bar?', 'Bar1', 50.0000
'Bar?', 'Bar2', 50.0000

Sorunuza güncellemede size bir satır üzerinde bir soru için tüm değerlerini dönmek istiyorum söylüyorlar. Sana not bunu deneyin, ve bunun yerine yukarıda size verdik yöntemini kullanırım tavsiye ederim. Eğer son kullanıcı için bir satır veri sunmak gerekiyorsa, bu PHP kullanarak yapılabilir.

Yanıtlar tablo muhtemelen QuestionID sütunu gerekmez unutmayın.

Bu size soru metni, seçim metin, ve seçim başı cevaplar sayıda alırsınız.

SELECT Questions.question, Choices.choice_text, Count(Answers.*) AS N
FROM Questions INNER JOIN Choices ON Questions.question_id = Choices.question_id
     LEFT JOIN Answers ON Choices.choice_id = Answers.choice_id
GROUP BY Questions.question_id, Choices.choice_id

Düzenleme: SQL çok, çok iyi olmadıkça, bu "hepsi bir satır" bölümü unutmak en iyisi - soru başına seçenek sayısı sadece bilinen, ancak sabit, ve hatta bu durumda olduğu sürece, o ain 'Kolay t. Bu gerçekten bir görüntüleme sorunu var, bu yüzden sonuçlarını görüntülemek zaman onunla başa.

Teorik olarak "tek bir satırda" sadece ama yapabileceğiniz bir PHP rutin bir parçası olarak görüntüleme amacıyla onları gerekiyorsa olsa ben, Mark Byers cevabını öneririm.

SELECT question, GROUP_CONCAT(choice_text) as choice_texts
FROM questions
JOIN choices
ON questions.question_id = choices.question_id
GROUP BY question;

Çıktı olur

'Foo?', 'Foo1,Foo2,Foo3'
'Bar?', 'Bar1,Bar2'

Not 'foo1, foo2, Foo3' tek sütun değil, üç sütun olarak iade edileceği, ve artmış olabilir ama GROUP_CONCAT varsayılan çıktıda 1024 karakter vardır. Sonuç büyük olabilir eğer onun tavsiye edilmez

SELECT questions.question_id, questions.question, choices.choice_id, choices.question_id
FROM questions, choices 
WHERE questions.question_id = choices.question_id 
AND questions.question_id = "Something"

Çalışması gerekir, diye düşünüyorum.