MySQL получает строки, но предпочитает одно значение столбца другому - PullRequest
1 голос
/ 04 декабря 2009

Немного странно, я хочу написать запрос MySQL, который будет получать результаты из таблицы, но предпочитать одно значение столбца другому, т.е.

id   name    value   prioirty
1    name1   value1  NULL
2    name1   value1  1
3    name2   value2  NULL
4    name3   value3  NULL

Таким образом, здесь name1 имеет две записи, но у одной есть примочка 1. Я хочу получить все значения из таблицы, но предпочитаю значения с любым приоритетом, за которым я иду.

Результаты, которые я хотел бы получить, были бы

id   name    value   prioirty
2    name1   value1  1
3    name2   value2  NULL
4    name3   value3  NULL

Эквивалентный способ сказать, что это «получить все строки из таблицы, но предпочитать строки с приоритетом x».

Ответы [ 4 ]

2 голосов
/ 04 декабря 2009

Это должно сделать это:

SELECT
     T1.id,
     T1.name,
     T1.value,
     T1.priority
FROM
     My_Table T1
LEFT OUTER JOIN My_Table T2 ON
     T2.name = T1.name AND
     T2.priority > COALESCE(T1.priority, -1)
WHERE
     T2.id IS NULL

Это также позволяет вам иметь несколько уровней приоритета, самый высокий из которых - тот, который вы хотите вернуть (если у вас есть 1 и 2, будет возвращено 2).

Я также скажу, что кажется, что есть некоторые проблемы с дизайном в БД. Мой подход был бы:

My_Table (id, name) My_Values ​​(идентификатор, приоритет, значение) с FK на идентификатор для идентификатора. PK на id в My_Table и id, приоритет в My_Values. Конечно, я бы тоже использовал соответствующие имена таблиц.

1 голос
/ 04 декабря 2009

Вы должны сначала изменить дизайн своего стола.

Должно быть:

YourTable (Id, Name, Value)
YourTablePriority (PriorityId, Priority, Id)

Обновление:

select * from YourTable a 
where a.Id not in 
   (select b.Id from YourTablePriority b)

Это должно работать на сервере sql, вам может потребоваться небольшое изменение, чтобы оно работало в mysql.

0 голосов
/ 05 декабря 2009

Если я правильно понимаю, вы хотите, чтобы value из name было задано специфично priority, или value было связано с NULL priority. (Вы не обязательно хотите MAX(priority), который существует.)

Да, у вас есть некоторые неуклюжие проблемы с дизайном, которые вы должны решить, но давайте решим проблему, которая у вас есть в настоящее время (и вы можете позже перейти к проблеме, которая должна быть :)):

mysql> SET @priority = 1;  -- the priority we want, if recorded

mysql> PREPARE stmt FROM "
       SELECT
         t0.*
       FROM
         t t0
       LEFT JOIN
         (SELECT DISTINCT name, priority FROM t WHERE priority = ?) t1
           ON t0.name = t1.name
       WHERE
         t0.priority = t1.priority
           OR
         t1.priority IS NULL
       ";

mysql> EXECUTE stmt USING @priority;
+----+-------+--------+----------+
| id | name  | value  | priority |
+----+-------+--------+----------+
|  2 | name1 | valueX |        1 | 
|  3 | name2 | value2 |     NULL | 
|  4 | name3 | value3 |     NULL | 
+----+-------+--------+----------+
3 rows in set (0.00 sec)

(Обратите внимание, что я изменил приоритетный value для "name1" на "valueX" в вышеприведенном - ваша исходная формулировка имела идентичные значения value для "name1" независимо от приоритета, что затрудняло для меня понять, почему вы старались отличать одно от другого.)

0 голосов
/ 04 декабря 2009

Может быть что-то вроде:

SELECT id, name, value, priority FROM 
table_name GROUP BY name ORDER BY priority

Хотя у меня нет базы данных, я не могу ее проверить ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...