需要有关MySQL的帮助。
我正在建立网上商店,并且在使用同一列上的多个WHERE IN子句过滤搜索结果时遇到问题。
我有表shopitem,过滤器,filter_option和shopitem_option。
shopitem(带有名称,描述,价格等的项目)
id
title
price
过滤器(主要过滤器类别,例如颜色,品牌,性别,尺寸等)
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表中,我有以下内容:
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)
但这是行不通的。如果我仅搜索40号鞋码或仅搜索黑色,则它将返回所有40号鞋码或所有黑色鞋码。但是,如果我结合使用过滤器来搜索颜色为黑色,尺寸为40的项目,则会返回空查询结果。
所以,基本上用户可以搜索鞋WHERE颜色(黑色或白色) 和大小(41或42) 和性别(男性)。我怎样才能做到这一点?
这样使用
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句