mysql - 使用多个连接格式化 RIGHT JOIN 查询
问题描述
我有有效的 SQL 查询:
SELECT table1.bike_id
FROM
(
SELECT bike_id
FROM `bike_filters`
WHERE (`bike_category_id` in (416,11111))
) as table1
RIGHT JOIN (
SELECT bike_id
FROM `bike_filters`
WHERE (`bike_category_id` in (5555,779))
) as table2 ON table1.bike_id = table2.bike_id
GROUP BY bike_id
但我需要添加更多RIGHT JOIN
的 s 行,可能是 5 个或更多。如何以正确的方式形成查询?我在同一张表中搜索,但在一个查询中加入多条记录以获得适合所有条件的bike_id。
这个查询的目的是获取bike_id
s,它包含查询的所有参数——bike 可以有 20 个过滤器,但是如果用户搜索 5 并且bike 匹配它们,我们通过这个查询得到bike_id。
表结构:
| id | bike_id | bike_category_id |
| 1 | 3 | 416 |
| 2 | 3 | 779 |
| 3 | 3 | 344 |
| 4 | 3 | 332 |
| 5 | 4 | 444 |
| 5 | 5 | 555 |
我需要这样的东西,这是不正确的:
SELECT table1.bike_id
FROM
(
SELECT bike_id
FROM `bike_filters`
WHERE (`bike_category_id` IN (416,11111))
) AS table1
RIGHT JOIN (
SELECT bike_id
FROM `bike_filters`
WHERE (`bike_category_id` IN (5555,779))
) AS table2
RIGHT JOIN (
SELECT bike_id
FROM `bike_filters`
WHERE (`bike_category_id` IN (5555,344))
) AS table3
RIGHT JOIN (
SELECT bike_id
FROM `bike_filters`
WHERE (`bike_category_id` IN (5555,332))
) AS table4
GROUP BY bike_id
解决方案
您可以使用聚合,并将所有条件放在HAVING
子句中,如下所示:
SELECT bike_id
FROM bike_filters
GROUP BY bike_id
HAVING
MAX(bike_category_id in (416,11111)) = 1
AND MAX(bike_category_id in (5555,779)) = 1
这将返回所有bike_id
s :
- 有类别
416
或11111
- 并有类别
5555
或779
您可以根据您的要求扩展该HAVING
条款。
推荐阅读
- asp.net-core-3.1 - 如何从 Startup.CS 查询数据库
- android - 如何使用 ktor 库和 kotlin 下载 .apk?
- javascript - 循环对象对象并在找到特定值时中断
- python - 为什么这个递归函数只在类中实例化变量时才起作用?
- olap - 基于 OLAP 级别的度量向下钻取问题
- vue.js - 无论如何我只能在 vue.js 中为 vuetify 导入必要的组件吗?
- python - 从最小到最大对列表元组进行排序(仅使用没有内置排序的循环和条件)
- neo4j - 自定义查询中相同标签节点的深度
- android - Android WorkManager 观察进度
- sql-server - SQL Unicode 正则表达式过滤韩语