来自id数组的MySQL SELECT,其中一个是必需的

时间:2012-03-17 15:24:09

标签: php mysql sql

我想知道实现此问题的最有效的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代表:

  • 住宿类型(露营= 20,假日小屋= 21)

OR

  • 大陆及其子区域(即欧洲= 1,英国= 2,英格兰= 3)

假设有人选择了他们对露营感兴趣(cat_id = 1)。现在我们需要计算欧洲有多少露营产品。产品可能被标记为欧洲(父母),英国(儿童)和英格兰(祖儿),为我们提供了一系列类别ID 1,2或3.所以我们现在需要计算有多少不同的产品这些类别和原始住宿类别1(露营)。

因此选择了Camping,最终结果可能如下:

  • 欧洲:4种露营产品
    • 英国:2种露营产品
      • 英格兰:1个露营产品
      • 威尔士:1个露营产品
    • 法国:2个露营产品 等

希望有帮助...

3 个答案:

答案 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)

没有子查询,使用JOINGROUP 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;