You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写含多条件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合并数组的效果一模一样,只是把合并步骤交给数据库完成,不用在代码里折腾数组了

用你的测试数据验证

就用你提供的三条示例数据:

idnameimagepriceinventorystock
4widgetpic.jpg6112
5boltbolt.jpg700
6troweltrow.jpg1210

不管用哪种方式,都会返回id=4和id=5的两条数据,id=6因为库存启用但无货,会被直接排除,完全符合你的期望结果。

内容的提问来源于stack exchange,提问作者Nadal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 10:52:42