Сортировка строк по количеству связанных записей «многие ко многим» - PullRequest
0 голосов
/ 05 октября 2010

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

По сути, у меня есть следующий запрос, который возвращает Venue s, которые имеют любые CheckIn s, содержащие искомый Keyword (в этом примере "foobar").

SELECT DISTINCT v.*
FROM "venues" v
  INNER JOIN "check_ins"   c  ON c."venue_id"     = v."id"
  INNER JOIN "keywordings" ks ON ks."check_in_id" = c."id"
  INNER JOIN "keywords"    k  ON ks."keyword_id"  = k."id"
WHERE (k."name" = 'foobar')

Я хочу SELECT и ORDER BY количество совпадений Keyword для каждого данного Venue. Например. если было создано 5 CheckIn s, связанных с этим Keyword, то должен быть возвращенный столбец (называемый чем-то вроде keyword_count) со значением 5, которое отсортировано.

В идеале это должно быть сделано без каких-либо запросов в предложении SELECT или, желательно, вообще без запросов.

Я боролся с этим некоторое время, и мой разум просто сходит с ума (возможно, это был слишком длинный день), поэтому некоторая помощь будет принята с благодарностью.

Заранее спасибо!

1 Ответ

1 голос
/ 05 октября 2010

Похоже, вам нужно что-то вроде:

SELECT v.x, v.y, count(*) AS keyword_count
FROM "venues" v
  INNER JOIN "check_ins"   c  ON c."venue_id"     = v."id"
  INNER JOIN "keywordings" ks ON ks."check_in_id" = c."id"
  INNER JOIN "keywords"    k  ON ks."keyword_id"  = k."id"
WHERE (k."name" = 'foobar')
GROUP BY v.x, v.y
ORDER BY 3
...