Mysql 如何进行多个SQL联接,以便返回符合特定条件的实体?
我有下表(这是一个横幅列表和每个横幅的可用尺寸): 我需要能够生成具有所有可能大小(16、32、64、128、256、512、1024)的所有bannerid的列表 因此,在本例中,结果应为:Mysql 如何进行多个SQL联接,以便返回符合特定条件的实体?,mysql,sql,join,relational-database,Mysql,Sql,Join,Relational Database,我有下表(这是一个横幅列表和每个横幅的可用尺寸): 我需要能够生成具有所有可能大小(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
--------
3, 16
3, 32
3, 64
3, 128
3, 256
3, 512
3, 1024
因为bannerid 3具有上述所有可能的尺寸(1和2缺少几个尺寸)
实现这一目标的好方法是什么?我认为有一种比在同一个表上执行7次联接并检查是否存在所有可能的大小组合更好的方法
我还需要一种方法来控制显示哪些横幅:(a)匹配所有大小的横幅,或者(b)匹配我指定的一些大小的横幅
问:我的桌子。。。是一个横幅列表和每个横幅的可用尺寸。
我需要能够生成所有bannerid的列表,其中包含所有
可能的尺寸
A:听起来你只是想要桌上的所有东西:)
按bannerid从mytable订单中选择*
如果表中还有其他列要排除,则:
选择bannerid,按bannerid从mytable订单中进行bannersize
如果您只需要一个bannerid的可用尺寸(例如“3”),则
选择bannerid,bannersize from mytable,其中bannerid=3
如果您需要某些特定横幅(例如“1”和“3”)的可用尺寸,则
选择bannerid,bannersize from mytable,其中bannerid位于(1,3)
问:我的桌子。。。是一个横幅列表和每个横幅的可用尺寸。
我需要能够生成所有bannerid的列表,其中包含所有
可能的尺寸
A:听起来你只是想要桌上的所有东西:)
按bannerid从mytable订单中选择*
如果表中还有其他列要排除,则:
选择bannerid,按bannerid从mytable订单中进行bannersize
如果您只需要一个bannerid的可用尺寸(例如“3”),则
选择bannerid,bannersize from mytable,其中bannerid=3
如果您需要某些特定横幅(例如“1”和“3”)的可用尺寸,则
从mytable中选择bannersize,其中bannersize位于(1,3)
您尚未发布您正在使用的数据库,如果您使用的是SQL Server 2005+(或Oracle 11g+),则可以使用
查询:
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
为您提供输出:
BANNERID 16 32 64 128 256 512 1024
3 1 1 1 1 1 1 1
您尚未发布正在使用的数据库,如果您使用的是SQL Server 2005+(或Oracle 11g+),则可以使用 查询:
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
为您提供输出:
BANNERID 16 32 64 128 256 512 1024
3 1 1 1 1 1 1 1
试试这个:
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
您也可以试穿它试试这个:
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
您也可以在上试用。您是否考虑过在中使用
的where
子句来接受几个可能的值?我相信这比使用简单的IN子句要复杂得多。我明白了,对不起,我错过了你想要的结果只匹配所有条件。根据这个问题,它要么需要多个联接,要么需要一个聚合,但是聚合速度较慢。您是否考虑过使用where
子句,该子句使用in
来接受几个可能的值?我相信这比使用简单IN子句更复杂。我明白了,请原谅,我错过了您想要的结果只匹配所有条件。根据这个问题,它需要多个联接或一个聚合,但聚合速度较慢如果这是一个存储过程,请不要使用“*”。列出字段名。我想你误解了我的问题。我不想选择bannerid=3的所有行。我想选择所有“完整”行,即具有完整大小的所有行。例如,bannerid 3只有在所有大小都可用时才会显示。如果这是一个存储过程,请不要使用“*”。列出字段名。我想你误解了我的问题。我不想选择bannerid=3的所有行。我想选择所有“完整”行,即具有完整大小的所有行。例如,bannerid 3只有在所有尺寸都可用的情况下才会显示。看起来可以使用,但需要修改它才能与MySQL一起使用。@Maverick下面的文章展示了如何在MySQL中使用pivot:看起来可以使用,但需要对其进行修改才能使用MySQL。@Maverick这篇文章展示了如何在MySQL中使用pivot:太好了+谢谢你介绍我认识Sqlfiddle。@Maverick感谢stackoverflow,因为我在这里学习了Sqlfiddle。还有一个JSFIDLE,你可能会对它感兴趣+谢谢你介绍我认识Sqlfiddle。@Maverick感谢stackoverflow,因为我在这里学习了Sqlfiddle。另外,您可能会对JSFIDLE感兴趣