Использование UNION не дает правильного результата - PullRequest
0 голосов
/ 08 июня 2019

У меня проблема. В моей таблице Wallets у меня есть 5 монет: LTC, BTC, ETH, BNB и USDT. Теперь я сначала хочу выбрать монету с наибольшим значением, но не USDT. И вторая монета должна быть монетой USDT. Итак, я попробовал этот запрос:

SELECT * 
FROM Wallets
WHERE NOT Coin='USDT' 
ORDER BY Value DESC LIMIT 1 
UNION
SELECT * 
FROM Wallets
WHERE Coin='USDT'

Но это дает мне все монеты, кроме USDT ... Странно то, что, когда я запускаю два запроса, отделенных друг от друга, результаты верны. Что я делаю не так?

Вот пример моей таблицы:

+------+----------+-------+
| Coin | Quantity | Value |
+------+----------+-------+
| LTC  |       10 |   200 |
| BTC  |        2 | 12000 |
| BNB  |        0 |     2 |
| ETH  |        0 |   0.1 |
| USDT |        0 |     0 |
+------+----------+-------+

Теперь я хочу этот результат:

+------+----------+-------+
| Coin | Quantity | Value |
+------+----------+-------+
| BTC  |        2 | 12000 |
| USDT |        0 |     0 |
+------+----------+-------+

Ответы [ 2 ]

1 голос
/ 08 июня 2019

Используйте UNION ALL вместо UNION

(SELECT * FROM Wallets WHERE NOT Coin='USDT' ORDER BY Value DESC LIMIT 1) 
UNION ALL
SELECT * FROM Wallets WHERE Coin='USDT'

Редактировать: работает только в MySQL 8

0 голосов
/ 08 июня 2019

Проблема с вашим запросом - отсутствие скобок.Итак, это должно сработать:

(SELECT w.* 
 FROM Wallets w
 WHERE Coin <> 'USDT' 
 ORDER BY Value DESC
 LIMIT 1 
) UNION
(SELECT w.* 
 FROM Wallets w
 WHERE Coin = 'USDT'
);

Я рекомендую UNION ALL, но это не имеет значения, поскольку здесь нет дубликатов - столбец COIN (как минимум) отличается.

На практике это вернет результаты по порядку.Тем не менее, MySQL не гарантирует, что результаты UNION ALL в порядке (насколько я знаю), поэтому я думаю, что вы должны добавить дополнительные ORDER BY:

(SELECT w.* 
 FROM Wallets w
 WHERE Coin <> 'USDT' 
 ORDER BY Value DESC
 LIMIT 1 
) UNION ALL
(SELECT w.* 
 FROM Wallets w
 WHERE Coin = 'USDT'
)
ORDER BY (Coin <> 'USDT') DESC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...