假如移动端在选择衣服时分别选择了过滤条件,码数:x码、xL码,腰型:高腰,发货地:大陆、欧洲,
那sql语句该怎么写呢?过滤条件又是动态可多选的,
表结构如下:
产品表(product):
productId,productName 此表为产品表,如
id1 衣服1
id2 衣服2
id3 衣服3
产品参数记录表(productType):
productId,choiceValueId,此表记录着产品都有那些规格参数
id1 choiceValueId1
id1 choiceValueId2
id1 choiceValueId3
id1 choiceValueId6
id1 choiceValueId8
id2 choiceValueId1
id2 choiceValueId2
id2 choiceValueId3
id2 choiceValueId4
id2 choiceValueId5
id2 choiceValueId7
id3 ..
..
..
产品参数类型key表(productTypeKey):
choiceId , name 此表为类型key表,如码数
choiceId1 码数
choiceId2 腰型
choiceId3 发货地
产品参数类型value表(productTypeValue):
choiceId ,choiceValueId, name 此表为物品类型value表,如衣服的s码
choiceId1 choiceValueId1 s码
choiceId1 choiceValueId2 X码
choiceId1 choiceValueId3 XXL码
choiceId2 choiceValueId4 高腰
choiceId2 choiceValueId5 中腰
choiceId2 choiceValueId6 低腰
choiceId3 choiceValueId7 大陆
choiceId3 choiceValueId8 区洲
应该写在移动端里面吧 连接到MySQL 然后查询修改数据
可以直接把几张表全部关联起来,然后按照条件查询。或者拼接动态sql语句
表结构如下:
产品表(product):productId,productName 此表为产品表,如
id1 衣服1
id2 衣服2
id3 衣服3
产品参数记录表(productType):productId,choiceValueId,此表记录着产品都有那些规格参数
id1 choiceValueId1
id1 choiceValueId2
id1 choiceValueId3
id1 choiceValueId6
id1 choiceValueId8
id2 choiceValueId1
id2 choiceValueId2
id2 choiceValueId3
id2 choiceValueId4
id2 choiceValueId5
id2 choiceValueId7
id3 ..
..
..
产品参数类型key表(productTypeKey):choiceId , name 此表为类型key表,如码数
choiceId1 码数
choiceId2 腰型
choiceId3 发货地
产品参数类型value表(productTypeValue):choiceId ,choiceValueId, name 此表为物品类型value表,如衣服的s码
choiceId1 choiceValueId1 s码
choiceId1 choiceValueId2 X码
choiceId1 choiceValueId3 XXL码
choiceId2 choiceValueId4 高腰
choiceId2 choiceValueId5 中腰
choiceId2 choiceValueId6 低腰
choiceId3 choiceValueId7 大陆
choiceId3 choiceValueId8 区洲
select * from product as a right join productType as b on a.productId = b.productId left join productTypeValue as c on b.choiceValueId =c.choiceValueId left join productTypeKey as d on c.choiceId = d.choiceId where c.name in ('x','xl') and d.name = '高腰'
像这种几乎不怎么变化得数据,而且后期维护得时候,不会涉及道修改得时候,简单得说,就是类型,码什么得,几乎都是固定,再一个表里加一个字段,用int或者是String都可以区分得,如果需要效率更好,可以分别些sql语句,不是难度,不一定要多表关联,而且这个一个衣服得数据,几乎都是必选项,直接以张表搞定,优化得话,可以写什么函数实现等等
select * from product as a left join (select productId,count(choiceValueId) as valueNum from productType as b left join productTypeValue as c on b.choiceValueId =c.choiceValueId left join productTypeKey as d on c.choiceId = d.choiceId where c.name in ('x','xl','高腰','大陆') group by productId)as e on a.productId=e.productId and e.valueNum=4
后面的4是查询条件的数量 ('x','xl','高腰','大陆')
目前想到一个办法,把答案贴出来,方便有需要的人,
explain
select *
from
(
select
spu.pId,spu.name as spuName,GROUP_CONCAT(choiceV.choiceValueId SEPARATOR ',') as mChoiceValueId, group_concat(choiceV.name SEPARATOR ',') as mChoiceName
from productTypeValue as choiceV
left join productTypeKey as choiceK on choiceV.choiceId = choiceK.choiceId
left join productType as choiceSpu on choiceV.choiceValueId = choiceSpu.choiceValueId
left join product as spu on choiceSpu.pId = spu.pId
where
choiceV.statu = 1
and choiceK.isSearchCondition = 1
group by spu.pId
) as nt where
(
FIND_IN_SET('2258ba1736f711e8976f02004c4f4f50', nt.mChoiceValueId)
or FIND_IN_SET('24490b7636f711e8976f02004c4f4f50', nt.mChoiceValueId)
) #android / ios
and
(
FIND_IN_SET('6b6244ad36f711e8976f02004c4f4f50', nt.mChoiceValueId)
or FIND_IN_SET('5fb49bd9370d11e8976f02004c4f4f50', nt.mChoiceValueId)
);
SELECT
P.productId,
p.productName ,
COUNT(DISTINCT tv.choiceId) AS ct,
GROUP_CONCAT(DISTINCT IF(tk.name = '码数',tv.name,NULL)) AS type1,
GROUP_CONCAT(DISTINCT IF(tk.name = '腰型',tv.name,NULL)) AS type2,
GROUP_CONCAT(DISTINCT IF(tk.name = '发货地',tv.name,NULL)) AS type3,
FROM product p , productType t, productTypeValue tv , productTypeKey tk
WHERE p.productId = t.productId AND t.choiceValueId = tv.choiceValueId AND tv.choiceId = tk.choiceId
AND ((tk.name = '码数' AND tv.name IN('x码','xL码')) OR (tk.name = '腰型' AND tv.name = '高腰') OR (tk.name = '发货地' AND tv.name IN ('大陆','欧洲')))
GROUP BY P.productId
HAVING ct = 3
以上是MySQL的语句。思路 尺码,腰型,发货地 这几个不同维度的条件时and关系。
有两个思路 1.使用exists 检查3个都满足的商品,缺点不能显示商品关联的尺码,腰型等,如果必须显示需要再次关联才能。 2.全联分组,SQL如上,没有明分别检测3个条件是否满足,通过分组后检查满足条件的类类别量 ct=3,来限制3个条件都满足