Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何进行多个SQL联接,以便返回符合特定条件的实体?_Mysql_Sql_Join_Relational Database - Fatal编程技术网

Mysql 如何进行多个SQL联接,以便返回符合特定条件的实体?

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次联接并检查是否存在所有可能的大小组合更好的

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

我需要能够生成具有所有可能大小(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次联接并检查是否存在所有可能的大小组合更好的方法

我还需要一种方法来控制显示哪些横幅:(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感兴趣