【问题标题】:Seeking guide for proper MySql "IF" method寻求正确的MySql“IF”方法指南
【发布时间】:2021-01-14 19:54:15
【问题描述】:

我需要获取特定列值的数据,但还包括项目IF 他们启用了inventory 并且stock 大于0。

以下只是一个概念查询,可以直观地了解我的意图。当然不行。

SELECT id, name, image, price
FROM shop
WHERE published = 1
AND price > 2
  /*concept clause here*/
    IF(inventory = 1 AND stock > 0, include, ignore)
  /*end concept*/
ORDER BY RAND() 
LIMIT 30

表结构

shop
__________________________________________
|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,'name'=>'widget','image'=>'pic.jpg','price'=>6],
    ['id'=>5,'name'=>'bolt','image'=>'bolt.jpg','price'=>7]
]

启用inventorystock 值为0 的行将在数组中。

如何根据这种情况取得成果?


有效但“肮脏”的解决方案

我已经运行了两次类似的查询,然后合并数组

获取未启用库存的商品

SELECT id, name, image, price
FROM shop
WHERE published = 1
AND price > 2
AND inventory = 0 
ORDER BY RAND() 
LIMIT 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

合并数组

$merged = array_merge($withoutInventory, $withInventory);

【问题讨论】:

    标签: mysql conditional-statements


    【解决方案1】:

    样本数据和预期结果将有助于澄清。我认为您需要将列选择和 OR 括起来

    SELECT id, name, image, price
    FROM shop
    WHERE (published = 1 AND price > 2) OR
          (inventory = 1 AND stock > 0)
    ORDER BY RAND() 
    LIMIT 30
    

    【讨论】:

    • 我之前尝试过您介绍的方法,但得到了null 结果。我编辑了问题以显示表格结构和所需的结果。
    • 您的表中没有published 列?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    相关资源
    最近更新 更多