Gre*_*ick 2 mysql sql relational-division
我有以下SQL:
SELECT `table1`.`value`, `table2`.*
FROM `table2`
INNER JOIN `table1` ON `table2`.`product_id` = `table1`.`entity_id`
WHERE `table2`.`created_at` > '2012-04-23' and
(`table1`.`value` = 264 OR `table1`.`value` = 260)
order by order_id
Run Code Online (Sandbox Code Playgroud)
返回一个这样的结果集(这只是返回结果的一部分):
value order_id ...
260 1234
260 1235
260 1236
264 1236
260 1237
260 1238
260 1239
264 1239
264 1240
260 1241
Run Code Online (Sandbox Code Playgroud)
我想要的是一个查询,它将获取这些结果,并且只返回order_id包含值260和264的订单.基于此示例,我要查找的最终结果是
260 1236
264 1236
260 1239
264 1239
Run Code Online (Sandbox Code Playgroud)
我的想法是这可以用一个子集完成,但我不完全确定完成它的细节.
这可以通过关系划分来完成:
select r.order_id from (
select
dividend.*
from your_table_or_query as dividend -- assumes no duplicates in `dividend`; use `distinct` if there are any
inner join divisor
on dividend.value = divisor.value
) as r
group by r.order_id
having count(*) = (select count(*) from divisor);
Run Code Online (Sandbox Code Playgroud)
结果:
+----------+
| order_id |
+----------+
| 1236 |
| 1239 |
+----------+
2 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
您的查询所在的位置your_table_or_query和
select 260 as value from dual union select 264 as value from dual
Run Code Online (Sandbox Code Playgroud)
是divisor.
这将返回订单ID 1236和1239; 然后,可以将它们join编辑为原始查询,以获取具有这些订单ID的所有行,如果这是您想要的.
完整查询以及insert语句:
create table divisor (value int);
insert into divisor values (260), (264);
create table your_table_or_query (value int, order_id int);
insert into your_table_or_query values (260, 1234), (260, 1235), (260, 1236), (264, 1236), (260, 1237), (260, 1238), (260, 1239), (264, 1239), (264, 1240), (260, 1241);
select y.* from (
select r.order_id from (
select
dividend.*
from your_table_or_query as dividend
inner join divisor
on dividend.value = divisor.value
) as r
group by r.order_id
having count(*) = (select count(*) from divisor)
) as quotient
inner join your_table_or_query y
on quotient.order_id = y.order_id;
Run Code Online (Sandbox Code Playgroud)
结果:
+-------+----------+
| value | order_id |
+-------+----------+
| 260 | 1236 |
| 264 | 1236 |
| 260 | 1239 |
| 264 | 1239 |
+-------+----------+
4 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
131 次 |
| 最近记录: |