问一个复杂的基于产品属性的 SQL 查询
2023-09-22 11:14:12 +08:00
yesterdaysun
现在有一个简单的产品属性表, KV 形式, 比如:
pid,name,value
(1,"num","2"),
(1,"category","M"),
(1,"price","high"),
(1,"heat","true"),
(1,"tag","4TX")
现在要根据选择的属性找出产品, 如果是每种单选的话吗, 大概知道怎么做, 就是
select * from ps where value in ("2","M") group by pid having count(*)=2
虽然也不知道这个做法有没有问题, 但至少能用, 但是如果是更复杂的组合就完全不知道怎么写了, 比如要满足 num=2 同时 category=M, 然后 price=high 和 heat=true 两个任意满足一个, 这个完全不知道怎么写
有大神能帮忙吗, 或者这个属性表是不是不应该这么设计?
求求
6 条回复
Waverly
2023-09-22 11:21:57 +08:00
SELECT *
FROM ps
WHERE (name = 'num' AND value = '2' AND pid IN (SELECT pid FROM your_table WHERE name = 'category' AND value = 'M'))
AND (name = 'price' AND value = 'high' OR name = 'heat' AND value = 'true');
swulling
2023-09-22 11:36:00 +08:00
表没问题。你这种多条件查询就只能二次筛选。就是 1L 的办法,先筛出一个条件,再筛第二个条件。
MoYi123
2023-09-22 11:43:11 +08:00
建议放 json 里面, 然后建个倒排索引. 不然太折磨了.
yesterdaysun
2023-09-22 11:54:57 +08:00
@
MoYi123 大哥, 能详细说一下这个方案吗? 是不是要换 ES, MySQL 能搞么
opengps
2023-09-22 12:19:55 +08:00
已经这么设计了吗?实在不行,用触发器自动更新到新的表结构吧,这种表写入量少,触发器没有太高并发还算适合
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/976121
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.