MySQL 在同一列上使用 AND 运算符的多个 WHERE IN

MySQL multiple WHERE IN on same column with AND operator

在 MySQL 方面需要一些帮助。

我正在建立网上商店,但我在使用同一列上的多个 WHERE IN 子句过滤搜索结果时遇到问题。

我有tables shopitem, filter, filter_optionshopitem_option.

shopitem(商品名称、描述、价格等)

id
title
price

filter(颜色、品牌、性别、尺码等主要筛选类别)

id
name

filter_option(尺寸(S、M、L)、颜色(黑色、白色)等过滤器选项)

id
name
filter_id (filter.id)

shopitem_option(项目与选项之间的联系)

id
shopitem_id (shopitem.id)
filter_id (filter.id)
filter_option_id (filter_option.id)

我有各种不同尺码、颜色、性别等的耐克气垫鞋...

所以在 shopitem_option table 我有以下内容:

id  |  shopitem_id  |  filter_id  |  filter_option_id
-----------------------------------------------------
1   |  Nike Air     |  Color      |  black
2   |  Nike Air     |  Color      |  white
3   |  Nike Air     |  Size       |  40
4   |  Nike Air     |  Size       |  41
5   |  Nike Air     |  Size       |  42
6   |  Nike Air     |  Gender     |  man

当我创建 MySQL 查询时,它需要像这样( 在纯 SQL 查询中而不是 'black','men'等有filter_option.id字段的ID)

SELECT shopitem.*
FROM shopitem
LEFT JOIN shopitem_option.shopitem_id = shopitem.id
WHERE
    shopitem_option.filter_option_id IN (black) AND 
    shopitem_option.filter_option_id IN (41,42) AND 
    shopitem_option.filter_option_id IN (man)

但这不起作用。如果我只搜索 size 40,或只搜索 color black,它会 return all shoes sizes 40 or all shoes with black颜色。但是,如果我结合过滤器来搜索颜色为黑色且尺寸为 40 的项目,它 return 的查询结果为空。

所以,基本上用户可以搜索鞋子 WHERE 颜色 (黑色 OR 白色) AND尺码(41OR42)AND性别(男)。我怎样才能做到这一点?

这样使用

SELECT si.*, GROUP_CONCAT(so.filter_option_id) AS filter_options
FROM shopitem si
LEFT JOIN shopitem_option so ON(so.shopitem_id = si.id)
HAVING
FIND_IN_SET('black', filter_options)
AND  FIND_IN_SET('41', filter_options)
AND FIND_IN_SET('man', filter_options)
GROUP BY si.id

为了从结果中计算 si.id 的数量,你可以像这样使用子查询

SELECT COUNT(res.id) FROM
  (SELECT si.*, GROUP_CONCAT(so.filter_option_id) AS filter_options
   FROM shopitem si
   LEFT JOIN shopitem_option so ON(so.shopitem_id = si.id)
   HAVING
   FIND_IN_SET('black', filter_options)
   AND  FIND_IN_SET('41', filter_options)
   AND FIND_IN_SET('man', filter_options)
   GROUP BY si.id) 
 AS res

IN ... AND IN ... 不能在这里工作,因为你告诉数据库 select shopitem_option 其中 filter_option_id 应该是 black41对于一个相同的记录。像这样使用 EXISTS

SELECT *
  FROM shopitem i
 WHERE EXISTS (SELECT 1 FROM shopitem_option o WHERE i.id = o.shopitem_id AND o.filter_option_id IN (black))
   AND EXISTS (SELECT 1 FROM shopitem_option o WHERE i.id = o.shopitem_id AND o.filter_option_id IN (41, 42))
   AND EXISTS (SELECT 1 FROM shopitem_option o WHERE i.id = o.shopitem_id AND o.filter_option_id IN (man))