0

我有下表(它是每个横幅和可用尺寸的列表):

bannerid, bannersize
--------------------
1, 16
1, 32
1, 128
2, 16
2, 32
2, 128
2, 256
2, 512
3, 16
3, 32
3, 64
3, 128
3, 256
3, 512
3, 1024

我需要能够生成具有所有可能大小(16、32、64、128、256、512、1024)的所有bannerid的列表

所以在这个例子中,结果应该是:

bannerid
--------
3, 16
3, 32
3, 64
3, 128
3, 256
3, 512
3, 1024

由于bannerid 3 具有上述所有可能的尺寸(1 和2 缺少一些尺寸)。

实现这一目标的好方法是什么?我认为有比在同一张表上执行 7 次连接并检查每个可能的大小组合是否存在更好的方法。

我还想要一种方法来控制显示哪个bannerid:(a)匹配所有尺寸的那些,或(b)匹配我指定的某些尺寸。

4

3 回答 3

4

试试这个 :

select b.* from banners b inner join
( select bannerid,count(bannersize) bl from banners
group by bannerid
having count(bannersize) = (select count(distinct(bannersize)) cl from banners) ) ab
on b.bannerid=ab.bannerid

你也可以在Sqlfiddle上试试

于 2012-10-21T12:32:47.000 回答
1

您还没有发布您正在使用的数据库,如果您使用的是 SQL Server 2005+(或 Oracle 11g+),您可以使用PIVOT

询问:

select * from banner
pivot (count(bannersize) for bannersize in ([16], [32], [64], [128], [256], [512], [1024])) as bann
where [16] > 0 and [32] > 0 and [64] > 0 and [128] > 0 and [256] > 0 and [512] > 0 and [1024] > 0

给你输出:

横幅 16 32 64 128 256 512 1024
3 1 1 1 1 1 1 1

where您可以通过 modyfing子句实现“(b)匹配我指定的某些尺寸” 。

此输出与请求的不同,但您可以通过将此查询用作子查询来“修复”它:

select * from banner
where bannerid in
(
select bannerid from banner
pivot (count(bannersize) for bannersize in ([16], [32], [64], [128], [256], [512], [1024])) as bann
where [16] > 0 and [32] > 0 and [64] > 0 and [128] > 0 and [256] > 0 and [512] > 0 and [1024] > 0
)
于 2012-10-21T02:49:46.863 回答
0

问:我的表格......是一个横幅ID列表和每个可用的尺寸。我需要能够生成具有所有可能尺寸的所有bannerid 的列表。

A:听起来你只想要表格中的所有内容:)

select * from mytable order by bannerid

如果您希望排除表中的其他列,则:

select bannerid, bannersize from mytable order by bannerid

如果您只想要一个bannerid 的可用尺寸(例如“3”),那么

select bannerid, bannersize from mytable where bannerid = 3

如果您想要某些特定bannerids(例如“1”和“3”)的可用尺寸,那么

select bannerid, bannersize from mytable where bannerid in (1, 3)

于 2012-10-21T00:46:26.757 回答