我想知道实现此问题的最有效的SQL查询:
假设我们有一个包含两列的表,一个存储条目ID(entry_id
),另一个存储类别ID(cat_id
):
entry_id cat_id
3 1
3 2
3 3
3 20
4 1
4 2
4 21
我想计算1,2或3类中有多少不同的entry_id
,但也必须在cat_id
20中。
例如,类别1,2和3可能代表音乐流派(国家,流行音乐等),而类别20可能是录音格式(CD,乙烯基等)。因此,另外一种口头表达方式可能是:“有多少产品出现在Vinyl以及Pop或Country类别中?”
我可以通过代码(PHP)中的嵌套循环或可能使用嵌套的SQL子查询来实现这一点,但感觉效率不高。我觉得必须有一个明显的答案让我盯着我......
编辑添加:
我还想在不修改数据库设计的情况下这样做,因为它是第三方系统。
澄清的进一步示例:
我需要这些数据的另一个现实例子:
我们假设类别ID代表:
OR
假设有人选择了他们对露营感兴趣(cat_id
= 1)。现在我们需要计算欧洲有多少露营产品。产品可能被标记为欧洲(父母),英国(儿童)和英格兰(祖儿),为我们提供了一系列类别ID 1,2或3.所以我们现在需要计算有多少不同的产品这些类别和原始住宿类别1(露营)。
因此选择了Camping,最终结果可能如下:
希望有帮助...
答案 0 :(得分:1)
select count(distinct entry_id) from myTable where cat_id=20 and entry_id in
(select distinct entry_id from myTable where cat_id in (1,2,3));
答案 1 :(得分:1)
我相信你想要GROUP BY,COUNT()和EXISTS()
declare @t table(entry_id int, cat_id int)
insert @t select 1, 1
insert @t select 2, 1
insert @t select 1, 2
insert @t select 2, 2
insert @t select 3, 1
insert @t select 1, 20
select t1.cat_id, COUNT(*)
from @t as t1
where exists(
select * from @t
where t1.entry_id = entry_id
and cat_id = 20)
group by t1.cat_id
V2使用join而不是EXISTS()
declare @t table(entry_id int, cat_id int)
insert @t select 1, 1
insert @t select 2, 1
insert @t select 1, 2
insert @t select 2, 2
insert @t select 3, 1
insert @t select 1, 20
select t1.cat_id, COUNT(*)
from @t as t1
join @t as t2 on t1.entry_id = t2.entry_id and t2.cat_id = 20
group by t1.cat_id
答案 2 :(得分:1)
没有子查询,使用JOIN
和GROUP BY
:
使用entry_id将表连接到自身(这为您提供了该entry_id的所有可能的cat_id对)。选择cat_id的成员(1,2,3)和第二个cat_id = 20。
SELECT r1.entry_id
FROM records r1
JOIN records r2 USING(entry_id)
WHERE r1.cat_id IN (1,2,3)
AND r2.cat_id = 20 GROUP BY entry_id;