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 order 和 CategoryName
列尚不存在.
筛选 category_id
的最佳方法是什么?类别的输入将以逗号分隔,但我可以使用 PHP 到 explode()
字符串来分隔它们。
您可以使用 LEFT
连接重写查询 Records
到 Categories
:
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
我有一个名为 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 order 和 CategoryName
列尚不存在.
筛选 category_id
的最佳方法是什么?类别的输入将以逗号分隔,但我可以使用 PHP 到 explode()
字符串来分隔它们。
您可以使用 LEFT
连接重写查询 Records
到 Categories
:
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