MySQL - выберите значение только один раз на основе другого поля - PullRequest
2 голосов
/ 20 марта 2019

Моя схема базы данных выглядит следующим образом:

CREATE TABLE test (
  id INT(11) UNSIGNED PRIMARY KEY,
  title VARCHAR(255) NOT NULL,
  priority ENUM('low', 'medium', 'high') NOT NULL
);

INSERT INTO test (id, title, priority) VALUES (1, 'test', 'medium');
INSERT INTO test (id, title, priority) VALUES (2, 'test', 'high');
INSERT INTO test (id, title, priority) VALUES (3, 'test2', 'low');

И мой запрос выглядит следующим образом:

SELECT * FROM test 
ORDER BY FIELD(priority, 'high', 'medium', 'low');

Я хотел бы сделать DISTINCT для поля title на основена priority поле.Например, если есть два или более данных с одинаковым title, я бы хотел выбрать только те, которые имеют наивысший приоритет, поэтому в моем случае ожидаемыми результатами будут данные с идентификаторами 2 и 3. Как это сделатьэто?

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

Попробуйте это ...

Таблица и пример данных

CREATE TABLE test (
  id INT(11) UNSIGNED PRIMARY KEY,
  title VARCHAR(255) NOT NULL,
  priority ENUM('low', 'medium', 'high') NOT NULL
);

INSERT INTO test (id, title, priority) VALUES (1, 'test', 'medium');
INSERT INTO test (id, title, priority) VALUES (2, 'test', 'high');
INSERT INTO test (id, title, priority) VALUES (3, 'test2', 'low');
INSERT INTO test (id, title, priority) VALUES (4, 'test2', 'low');
INSERT INTO test (id, title, priority) VALUES (5, 'test2', 'low');
INSERT INTO test (id, title, priority) VALUES (6, 'test', 'low');
INSERT INTO test (id, title, priority) VALUES (7, 'test3', 'low');
INSERT INTO test (id, title, priority) VALUES (8, 'test3', 'high');
INSERT INTO test (id, title, priority) VALUES (9, 'test3', 'medium');

Запрос

SELECT Max(t2.id)  AS ID,
       t1.title    AS Title,
       t1.priority AS Priority
FROM   (SELECT title,
               Min(priority) AS priority
        FROM   test
        GROUP  BY title
        ORDER  BY Field(priority, 'high', 'medium', 'low')) t1
       INNER JOIN test t2 using (title, priority)
GROUP  BY t1.title,
          t1.priority;  

выход

+-----+--------+----------+
| ID  | Title  | Priority |
+-----+--------+----------+
|  2  | test   | high     |
|  5  | test2  | low      |
|  8  | test3  | high     |
+-----+--------+----------+
0 голосов
/ 20 марта 2019

Один метод:

SELECT t.*
FROM test t
WHERE FIELD(priority, 'high', 'medium', 'low') =
          (SELECT MIN(FIELD(priority, 'high', 'medium', 'low'))
           FROM test t2
           WHERE t2.title = t.title
          );

EDIT:

Я не думал, что приоритеты можно повторить. Выше можно изменить, чтобы использовать id:

SELECT t.*
FROM test t
WHERE id = (SELECT id
            FROM test t2
            WHERE t2.title = t.title
            ORDER BY FIELD(priority, 'high', 'medium', 'low')
            LIMIT 1
           );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...