如何编写含多条件WHERE子句的MySQL查询筛选指定商品数据
用单条SQL搞定你的商品筛选需求
嘿,其实你完全不用分两次查询再合并数组,用两种方式都能实现单条查询搞定,逻辑清晰又优雅:
方式一:整合筛选条件,一次性捞取符合要求的商品
直接把两类合法商品的判断逻辑揉进WHERE子句里,核心是用OR把两种有效情况组合起来:
SELECT id, name, image, price FROM shop WHERE published = 1 AND price > 2 AND ( inventory = 0 OR (inventory = 1 AND stock > 0) ) ORDER BY RAND() LIMIT 30;
逻辑拆解:
- 先写上所有商品都要满足的基础门槛:
published = 1和price > 2 - 括号里的
OR分支对应两类可入选的商品:- 第一类:库存未启用(
inventory = 0),这类商品不管库存数量多少都能纳入结果 - 第二类:库存已启用(
inventory = 1)但必须有货(stock > 0),没货的直接排除
- 第一类:库存未启用(
- 最后通过
ORDER BY RAND()随机排序,LIMIT 30限制返回数量,和你原本的需求完全匹配
方式二:完全模拟你原有的合并逻辑(分批次取数)
如果你就是想要先拿最多30条无库存启用的商品,再补充最多30条有库存的商品,那用UNION ALL把两个子查询拼起来就行:
-- 先捞取库存未启用的商品,随机取30条 SELECT id, name, image, price FROM shop WHERE published = 1 AND price > 2 AND inventory = 0 ORDER BY RAND() LIMIT 30 UNION ALL -- 再捞取库存启用且有货的商品,同样随机取30条 SELECT id, name, image, price FROM shop WHERE published = 1 AND price > 2 AND inventory = 1 AND stock > 0 ORDER BY RAND() LIMIT 30;
效果说明:
UNION ALL会直接把两个查询的结果拼接在一起,不会去重(毕竟两类商品的条件互斥,根本不会有重复数据)- 最终结果和你原来两次查询后用
array_merge合并数组的效果一模一样,只是把合并步骤交给数据库完成,不用在代码里折腾数组了
用你的测试数据验证
就用你提供的三条示例数据:
| id | name | image | price | inventory | stock |
|---|---|---|---|---|---|
| 4 | widget | pic.jpg | 6 | 1 | 12 |
| 5 | bolt | bolt.jpg | 7 | 0 | 0 |
| 6 | trowel | trow.jpg | 12 | 1 | 0 |
不管用哪种方式,都会返回id=4和id=5的两条数据,id=6因为库存启用但无货,会被直接排除,完全符合你的期望结果。
内容的提问来源于stack exchange,提问作者Nadal
相关产品推荐
相关产品推荐

