首页 > 解决方案 > 使用多个连接格式化 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_ids,它包含查询的所有参数——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

标签: mysqlsqldatabasegroup-bysubquery

解决方案


您可以使用聚合,并将所有条件放在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_ids :

  • 有类别416 11111
  • 有类别5555779

您可以根据您的要求扩展该HAVING条款。


推荐阅读