查询具有1个条件的三个表

时间:2009-05-09 13:15:33

标签: sql mysql

我有以下表格:

代码

id tag_name

实施例

id类别标题

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 个答案:

答案 0 :(得分:1)

这是一个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

答案 1 :(得分:1)

如果没有连接,则接下来是正确的:

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