Я вижу некоторые несоответствия с данными вашего примера.Вы ищете вещи со специальным, ограниченным или нормальным значением, которые имеют значения> 1, но ваш примерный набор данных имеет только значения 1. Вы никогда не получите никаких результатов из этого набора данных вообще, потому что ничто никогда не будет соответствовать предложению WHERE.
Кроме того, вы задаете предложения ORDER BY с помощью DESC, но в примере, который вы хотите видеть в качестве результата, вы показываете их отсортированными по возрастанию.
Я собираюсь сделать двапредположения здесь:
1) Вы на самом деле хотите, чтобы их значения были> 0, а не> 1 (если вам нужно только ненулевое значение, запрос становится проще, но поскольку вы специально использовали ABS () IЯ предполагаю, что реальные данные, с которыми вы работаете, могут иметь отрицательные значения).
2) Вы действительно имели в виду ASC, а не DESC, поскольку запрашиваемый вывод находится в таком порядке.
Поэтому, используя данные, которые вы указали выше, будет работать следующий запрос:
SELECT pnumber,
CONCAT('(',
CONCAT_WS(', ',
IF(special > 0, 'special', NULL),
IF(limitedtime > 0, 'limited time', NULL),
IF(normal > 0, 'normal', NULL)),
')') AS type_desc,
IF(special > 0, 3, 0) + IF(limitedtime > 0, 2, 0) + IF(normal > 0, 1, 0) AS disp_priority
FROM ex_table
WHERE ((special > 0) + (limitedtime > 0) + (normal > 0)) > 0
ORDER BY disp_priority DESC,
ABS(pnumber) ASC
Не требуется UNION.Также обратите внимание, что UNION может не дать вам того, что вы ищете в любом случае: если вы используете один из примеров UNION, показанных выше, то в случае, когда оба специальных> 0 И ограниченное время> 0 вы получите дублирующую строку вывода,так как он будет соответствовать более чем одному из запросов UNION.
Приведенный ниже запрос выводит в монитор MySQL следующее:
+---------+----------------+---------------+
| pnumber | type_desc | disp_priority |
+---------+----------------+---------------+
| 765234 | (special) | 3 |
| 776235 | (special) | 3 |
| 785457 | (special) | 3 |
| 765235 | (limited time) | 2 |
| 785456 | (limited time) | 2 |
| 776234 | (normal) | 1 |
+---------+----------------+---------------+
6 rows in set (0.23 sec)
И, за исключением дополнительного выходного столбца,это именно то, что вы просили сделать.