【问题标题】:Formating RIGHT JOIN query with multiple joins使用多个连接格式化 RIGHT JOIN 查询
【发布时间】:2019-03-31 13:07:01
【问题描述】:

我有一个有效的 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 JOINs 行,可能是 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

【问题讨论】:

  • 你说“但是如果用户搜索 5 并且 bike 匹配他们,我们通过这个查询得到 bike_id”。匹配其中 1 个或全部 5 个?
  • @JimCastro 匹配所有五个!

标签: mysql sql database group-by subquery


【解决方案1】:

可以使用聚合,将所有条件放在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 子句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 2023-03-12
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多