簡體   English   中英

如何從多列獲取最小/最小值但使用mysql忽略0作為最小值/最小值?

[英]How to get least/min value from multiple columns but ignore 0 as min/least value using mysql?

我試圖從16列中獲取結果,以查找哪個列具有最小值但該最小值不應為0。

所以我根據一些建議嘗試了我的查詢,但它對我不起作用,因為它返回0。

SELECT least(
    IFNULL(col_1,0),
    IFNULL(col_2,0),
    IFNULL(col_3,0),
    IFNULL(col_4,0),
    IFNULL(col_5,0),
    IFNULL(col_6,0),
    IFNULL(col_7,0),
    IFNULL(col_8,0),
    IFNULL(col_9,0),
    IFNULL(col_10,0),
    IFNULL(col_11,0),
    IFNULL(col_12,0),
    IFNULL(col_13,0),
    IFNULL(col_14,0),
    IFNULL(col_15,0),
    IFNULL(col_16,0)) as lowest
FROM `my_date_table` 
where date_id = '108'

謝謝,請不要標記為重復問題,因為我已經完成了一些堆棧問題,但找不到我可以在php / mysql上查詢的正確解決方案。

這不是一件容易的事。 你不能簡單地把所有的0秒至NULL小號因為LEAST()返回NULL ,如果它的任何參數是NULL

如果您事先知道所有列的最大值,則可以使用Barmar評論的技巧

另外,假設您在表中有一個名為id的主鍵,(次優)解決方案可能是使用UNION ALL對表進行取消,同時將0值轉換為NULL值; 然后,您可以利用聚合函數MIN() ,它忽略NULL值。

5列的示例查詢:

SELECT id, MIN(col) lowest
FROM (
    SELECT id, NULLIF(col1, 0) col FROM mytable
    UNION ALL SELECT id, NULLIF(col2, 0) FROM mytable
    UNION ALL SELECT id, NULLIF(col3, 0) FROM mytable
    UNION ALL SELECT id, NULLIF(col4, 0) FROM mytable
    UNION ALL SELECT id, NULLIF(col5, 0) FROM mytable
) x
GROUP BY id

DB Fiddle上的演示

樣本數據:

| id  | col1 | col2 | col3 | col4 | col5 |
| --- | ---- | ---- | ---- | ---- | ---- |
| 1   | 1    | 2    | 3    | 4    | 5    |
| 2   | 0    | 6    | 7    | 8    | 9    |
| 3   | 0    | 10   | 11   | 12   |      |

結果:

| id  | lowest |
| --- | ------ |
| 1   | 1      |
| 2   | 6      |
| 3   | 10     |

如果列的最大可能值,則可以在調用LEAST之前將任何零值替換為高於此最大值的值。 然后它將返回低於此最大值的最小列的值。

在下面的代碼中,我假設999999足夠大。

SELECT least(
    IF(IFNULL(col_1,0) = 0, 999999, col_1),
    IF(IFNULL(col_2,0) = 0, 999999, col_2),
    IF(IFNULL(col_3,0) = 0, 999999, col_3),
    IF(IFNULL(col_4,0) = 0, 999999, col_4),
    IF(IFNULL(col_5,0) = 0, 999999, col_5),
    IF(IFNULL(col_6,0) = 0, 999999, col_6),
    IF(IFNULL(col_7,0) = 0, 999999, col_7),
    IF(IFNULL(col_8,0) = 0, 999999, col_8),
    IF(IFNULL(col_9,0) = 0, 999999, col_9),
    IF(IFNULL(col_10,0) = 0, 999999, col_10),
    IF(IFNULL(col_11,0) = 0, 999999, col_11),
    IF(IFNULL(col_12,0) = 0, 999999, col_12),
    IF(IFNULL(col_13,0) = 0, 999999, col_13),
    IF(IFNULL(col_14,0) = 0, 999999, col_14),
    IF(IFNULL(col_15,0) = 0, 999999, col_15),
    IF(IFNULL(col_16,0) = 0, 999999, col_16)) as lowest
FROM `my_date_table` 
where date_id = '108'

一種相對簡單(但價格昂貴)的方法是展開和聚合:

select min(col), max(col)
from ((select col_1 as col from t) union all
      (select col_2 as col from t) union all
      . . .
      (select col_16 as col from t) 
     ) c
where col <> 0;

如果你想表達這種使用least()你可以使用coalesce() nullif()

select nullif( least( coalesce(nullif(col_1, 0), 999999),
                      coalesce(nullif(col_2, 0), 999999),
                      . . .
                    ), 999999
              )

這假設您有一些合理的最大值可用於999999

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM