我有所谓的链接,可以为它们分配标签,所以我将它存储在3个表中:
现在我需要获得基本标签计数:标签使用次数(包括0次)。我有两个问题:
select t.id, t.name, count(*)
from tag as t inner join tag_in_link as tl
on tl.tag_id = t.id
group by t.id, t.name
union
select t.id, t.name, 0
from tag as t left outer join tag_in_link as tl
on tl.tag_id = t.id where tl.tag_id is null
和
select t.id, t.name,
(select count(*) from tag_in_link as tl
where tl.tag_id = t.id
) as count from tag as t
他们都给出相同的(达到记录顺序)结果并且工作几乎一样快
问题是我没有太多数据来测试它,但我今天需要采取这样或那样的方式。我所知道的就是:
所以我的问题:
答案 0 :(得分:1)
对于大型数据集,第一个查询会更好,因为它不会强制嵌套循环。
但为什么不使用最佳查询:
self
答案 1 :(得分:0)
考虑将UNION
与条件聚合相结合,仍然避免每行的相关子查询运行。
select t.id, t.name,
sum(case when tl.tag_id is null then 0 else 1 end) as tag_count
from tag as t
left join tag_in_link as tl
on tl.tag_id = t.id
group by t.id, t.name