简体   繁体   English

mysql select语句中的回退条件

[英]Fallback condition in a mysql select statement

I want to put a condition into MySql statement. 我想在MySql语句中添加一个条件。 If that is even possible? 如果可能的话?

This is my current mysql select statement 这是我当前的mysql select语句

SELECT *
      FROM `validproduct`
      WHERE `visible` = 1
      AND `typeid` = 2
      AND `sizeid` = 3
      GROUP BY `productid`

So at the moment, I am selecting products with sizeid = 3. What I want to do is to select products with size = 1, and if that doesn't exist, then select sizeid = 3. 所以目前,我选择sizeid = 3的产品。我想要做的是选择size = 1的产品,如果不存在,那么选择sizeid = 3。

My validproducts table contains a list of products with up to 6 different sizes associated with it (which in turn have different pricing). 我的有效产品表包含与其关联的最多6种不同尺寸的产品列表(反过来具有不同的定价)。 I want to return all of my products, with the lowest sizeid (which will also have the lowest price available for that product). 我想要退回所有我的产品,使用最小的sizeid(也将是该产品的最低价格)。 Not all products have a sizeid 1. 并非所有产品都有sizeid 1。

So my return data will be something like product A (sizeid 1, $x); 所以我的返回数据将类似于产品A(sizeid 1,$ x); product B (sizeid 3, $y) etc 产品B(sizeid 3,$ y)等

Here is a way to do it: 这是一种方法:

SELECT 
  vp1.* 
FROM 
  validproduct vp1 
INNER JOIN
  (
    SELECT 
      productid, MIN(sizeid) as minsize 
    FROM 
      validproduct 
    WHERE 
      visible = TRUE AND
      typeid = 2
    GROUP BY
    productid
  ) AS vp2
ON 
  vp1.productid = vp2.productid AND 
  vp1.sizeid = vp2.minsize AND 
  vp1.visible = TRUE AND
  vp1.typeid = 2
GROUP BY 
  vp1.productid;

Explanation: 说明:

The outer query is actually what you already have. 外部查询实际上是您已有的。 The inner sub-query finds the minimum sizeid for every product. 内部子查询查找每个产品的最小sizeid。 By joining the two you get what you want. 通过加入这两个你得到你想要的。

PLZ SEE THE FIDDLE PLZ看到了这个骗局

It's a bit weird, but OK I guess... 这有点奇怪,但我猜...

SELECT * FROM ints;
+---+
| i |
+---+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+---+

SELECT COALESCE(i2.i,i1.i)m FROM ints i1 LEFT JOIN ints i2 ON i2.i = 3 WHERE i1.i = 1;
+------+
| m    |
+------+
|    3 |
+------+

SELECT COALESCE(i2.i,i1.i)m FROM ints i1 LEFT JOIN ints i2 ON i2.i = 11 WHERE i1.i = 1;
+------+
| m    |
+------+
|    1 |
+------+

or maybe... 或者可能...

SELECT i FROM ints ORDER BY FIELD(i,1,3) DESC LIMIT 1;
+---+
| i |
+---+
| 3 |
+---+

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM