我只想在foreach
循环中显示所有这些中的最大值。以下查询位于此foreach
循环中。
SELECT MAX(substring_index(data_column, ' ', -1))
FROM table
WHERE id = '{id-from-the-loop}'
AND data_column != ''
查询给了我这个结果:
Data A
Data A
Data C
Data B
Data G
Data E
G
是上面列表中的最高值,因此它将像下面的列表一样显示,但是我无法弄清楚!
Data
Data
Data
Data
Data G
Data
我该如何解决?
答案 0 :(得分:0)
您可以尝试执行此操作,编写一个子查询以通过limit 1
和order by
来获得它们的最高价值
然后使用具有outer join
功能的自我coalesce
。
CREATE TABLE T(col varchar(50));
INSERT INTO T VALUES ('Data A');
INSERT INTO T VALUES ('Data A');
INSERT INTO T VALUES ('Data C');
INSERT INTO T VALUES ('Data B');
INSERT INTO T VALUES ('Data G');
INSERT INTO T VALUES ('Data E');
查询1 :
SELECT coalesce(t2.col,substring_index(t1.col, ' ', 1)) col
FROM T t1 LEFT JOIN (
select col
from t
order by col desc
limit 1
) t2 on t1.col =t2.col
Results :
| col |
|--------|
| Data G |
| Data |
| Data |
| Data |
| Data |
| Data |
答案 1 :(得分:0)
自MariaDB 10.2.0起,您可以使用max()
的窗口版本。检查CASE
中字符串的第二部分是否为ID的最大值,如果是则返回完整的字符串。否则,只返回第一部分。
SELECT CASE substring_index(t1.data_column,
' ',
-1)
WHEN max(substring_index(t1.data_column,
' ',
-1)) OVER (PARTITION BY id) THEN
data_column
ELSE
substring_index(t1.data_column,
' ',
1)
END
FROM elbat t1
WHERE id = ?
AND data_column <> '';
我不知道上下文是什么,但是如果可能的话,您不应使用这样的ID循环,而应生成完整的集合,然后对其进行迭代。这可能会快得多。假设您有要处理的ID列表,则可以使用IN
并看起来像这样:
SELECT id,
CASE substring_index(t1.data_column,
' ',
-1)
WHEN max(substring_index(t1.data_column,
' ',
-1)) OVER (PARTITION BY id) THEN
data_column
ELSE
substring_index(t1.data_column,
' ',
1)
END data
FROM elbat t1
WHERE id IN (?, ..., ?)
AND data_column <> '';