Запрос на три таблицы с 1 условием - PullRequest
0 голосов
/ 09 мая 2009

У меня есть следующие таблицы:

метка

id tag_name

примеры

Идентификатор категории

examples_tags

id tag_id example_id

Как узнать количество примеров для каждого тега? (на самом деле немного похоже на stackoverflow:))

Я также хочу дополнительное условие типа: examples.category = "английские примеры"

Вот так я и начал ...

SELECT tags.id, tags.tag_name, COUNT( examples_tags.tag_id ) AS 'no_tags'
WHERE tags.id = examples_tags.tag_id

&&
examples.category = 'english examples'

GROUP BY tags.id

Спасибо.

Ответы [ 2 ]

1 голос
/ 09 мая 2009

Без объединений правильно будет следующее:

SELECT tags.id, tags.tag_name, COUNT(*) AS num_tags
FROM tags, examples_tags, examples
WHERE tags.id = examples_tags.tag_id 
    and examples_tags.example_id=examples.id
    and examples.category = 'english examples'
GROUP BY tags.id, tags.tag_name

Вам нужно сгруппировать по всем неагрегированным полям.

В противном случае вы можете использовать внутреннее соединение, что делает запрос более читабельным:

SELECT tags.id, tags.tag_name, COUNT(*) AS num_tags
FROM tags 
    inner join examples_tags on examples_tags.tag_id=tags.id
    inner join examples on examples_tags.example_id=examples.id
WHERE examples.category = 'english examples'
GROUP BY tags.id, tags.tag_name
1 голос
/ 09 мая 2009

Это объединение из 3 таблиц, использующее таблицу examples_tags «многие ко многим» в середине между таблицами тегов и примеров. Вы также должны группировать по каждому столбцу, который не является агрегатом в списке выбора.

SELECT t.id, t.tag_name, COUNT( *) AS 'no_tags'
FROM tags t
 JOIN examples_tags et
   ON t.id = et.tag_id
 JOIN examples e
   ON e.example_id = e.id
WHERE 
  e.category = 'english examples'
GROUP BY t.id, t.tag_name
ORDER BY t.tag_name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...