MySQL WHERE 过滤器基于 SELECT 中的子查询

MySQL WHERE filter based on subquery in SELECT

我有一个名为 Records 的 table 来显示产品。我还有一个名为 Categories 的 table,它显示每个产品的类别(如果存在的话)。

Categories table 结构喜欢:

id    category_id
--    -----------
1     1
1     3
3     1
3     2
5     4

我运行 拉取记录 ID 和类别 ID 的查询是:

SELECT 
    Records.id,
    (SELECT
        GROUP_CONCAT(C.category_id)
    FROM `Categories` C
    WHERE Records.id = C.id) AS 'CategoryName'
FROM 
    Records

输出将return:

id    CategoryName
--    ------------
1     1,3
2     NULL
3     1,2
4     4
5     NULL

我的网站有一个区域,用户可以在其中按类别过滤记录。假设用户想要过滤类别 = 1 或 2。我想我只是加上 WHERE FIND_IN_SET(1,CategoryName) OR FIND_IN_SET(2,CategoryName) 但这不起作用,因为 MySQL execution orderCategoryName 列尚不存在.

筛选 category_id 的最佳方法是什么?类别的输入将以逗号分隔,但我可以使用 PHP 到 explode() 字符串来分隔它们。

您可以使用 LEFT 连接重写查询 RecordsCategories:

SELECT r.id,
       GROUP_CONCAT(c.category_id) AS CategoryName
FROM Records r LEFT JOIN Categories c
ON c.id = r.id
GROUP BY r.id

如果您想使用相同的查询进行过滤,您只需在末尾添加一个 HAVING 子句:

HAVING FIND_IN_SET(1, CategoryName) OR FIND_IN_SET(2, CategoryName)

或者,您可以先过滤再聚合:

SELECT r.id,
       GROUP_CONCAT(c.category_id) AS CategoryName
FROM Records r INNER JOIN Categories c
ON c.id = r.id
WHERE c.category_id IN (1, 2)
GROUP BY r.id