Присоединиться + Количество в строке в postgresql - PullRequest
2 голосов
/ 15 октября 2010

Текущая таблица «Попытки»:

ID  QUESTION_ID   CORRECT
1   1             FALSE
2   2             TRUE
3   4             FALSE
4   3             FALSE
5   1             TRUE
6   1             TRUE
7   4             TRUE
8   3             TRUE
9   4             FALSE
10   1             TRUE
11   2             TRUE
11   1             FALSE
11   3             FALSE

Текущая таблица «Вопросов»:

ID  ANSWER
1   A
2   A
3   B
4   C
5   C
6   C
7   C

Теперь я хочу заказать Вопросы в зависимости от того, сколько раз они решены. Как видите, Вопрос 1 был решен 3 раза, а Вопрос 5, 6 и 7 - 0 раз. После того, как я сделаю этот заказ, я хочу выбрать топ-5 вопросов с наименьшим количеством решенных вопросов.

Поэтому мои вопросы таковы: как это сделать? Моя конечная цель - сделать это в рельсах, но сначала я хочу немного поэкспериментировать с postgresql. Так ты знаешь, как это сделать? Примеры кода высоко ценятся.

С уважением,

Maurice

// ОБНОВЛЕНИЕ

Хорошо, я пытался применить ваш совет на практике, но я столкнулся с проблемой. Как вы можете видеть, я просто получаю 1 строку, я думаю, из-за предложения where. Может ли быть так, что я считаю это неправильно?

=# select q.id, count(q.id)
-# from questions as q
-# left join attempts as a on a.question_id = q.id
-# where a.correct = true and a.user_id = 4
-# group by q.id
-# order by count(q.id) desc
-# limit 20
-# \g
 id  | count 
-----+-------
 112 |     2
(1 row)

// ОБНОВЛЕНИЕ 2

хорошо, я сделал вложенный выбор, чтобы решить эту проблему (вдохновленный Как присоединиться к COUNT из таблицы, а затем выполнить этот COUNT с другим JOIN ):

select q.id, temp.Count
from questions as q
left join
(select q.id, count(a.id) as count
from questions as q
left join attempts as a
on a.question_id = q.id
where a.correct = true and a.user_id = 4
group by q.id)
temp on temp.id = q.id

Дали мне кое-что: важный список.

Теперь мне все еще нужно создать случайных 5 вопросов с наименьшим количеством отсчетов .

Сейчас я пытаюсь что-то сделать с помощью min (count), но, похоже, это не сработает. Есть идеи как это сделать?

Еще раз спасибо

Ответы [ 2 ]

9 голосов
/ 15 октября 2010
SELECT Q.ID, COUNT(A.ID) AS SolveCount
FROM Question Q
LEFT JOIN Attempts A
ON A.QUESTION_ID = Q.ID
WHERE A.CORRECT = TRUE
GROUP BY Q.ID
ORDER BY COUNT(A.ID)
1 голос
/ 15 октября 2010

Как насчет чего-то подобного?

SELECT Q.ID, COUNT()
FROM Questions AS Q
LEFT JOIN Attempts AS A ON A.QUESTION_ID = Q.ID
WHERE A.CORRECT = TRUE
GROUP BY Q.ID
ORDER BY COUNT() DESC
LIMIT 5

Резюме: Он соединяет таблицу вопросов с таблицей попыток, рассматривает только те строки, в которых значение true равно true, группирует по идентификатору вопроса, сортирует по количеству истинных попыток на вопрос, а затем ограничивает первые пять результатов.

Я не проверял это, но я думаю, что оно должно быть, по крайней мере, близко к тому, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...