Фильтрация mysql результатов запроса по приоритету столбца - PullRequest
1 голос
/ 26 мая 2020

Я пытаюсь отфильтровать строки из результатов объединенного запроса select, которые имеют одинаковое значение столбца id_user, но имеют более низкий приоритет сортировки. Столбец sort1 имеет наивысший приоритет, а sort4 - самый низкий. Имя столбца задает приоритет, а не значение внутри.

Пользователи таблицы:

CREATE TABLE `users` (
  `user_id` int(11) NOT NULL,
  `name` varchar(30) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;



INSERT INTO `users` (`user_id`, `name`) VALUES
(1, 'Some Name'),
(2, 'Some Other Name');


ALTER TABLE `users`
  ADD PRIMARY KEY (`user_id`);

Элементы таблицы:

CREATE TABLE `items` (
  `id_user` int(11) NOT NULL,
  `sort1` int(11) DEFAULT NULL,
  `sort2` int(11) DEFAULT NULL,
  `sort3` int(11) DEFAULT NULL,
  `sort4` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO `items` (`id_user`, `sort1`, `sort2`, `sort3`, `sort4`) VALUES
(1, NULL, NULL, 39, NULL),
(2, NULL, NULL, NULL, 45),
(1, NULL, 34, NULL, NULL);

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

SELECT
    users.name,
    items.id_user,
    items.sort1,
    items.sort2,
    items.sort3,
    items.sort4
FROM
    items
LEFT JOIN users ON items.id_user = users.user_id
WHERE
    (
        items.sort1 = '' OR items.sort1 IS NULL
    ) AND(
        items.sort2 = 34 OR items.sort2 IS NULL
    ) AND(
        items.sort3 = 39 OR items.sort3 IS NULL
    ) AND(
        items.sort4 = 45 OR items.sort4 IS NULL
    )

Фактический результат:

|       Name      | id_user | sort1 | sort2 | sort3 | sort4 |
+-----------------+---------+-------+-------+-------+-------|
|  Some Name      |    1    |  NULL |  NULL |   39  |  NULL |
| Some Other Name |    2    |  NULL |  NULL |  NULL |   45  |
|  Some Name      |    1    |  NULL |   34  |  NULL |  NULL |

Первая строка дополнительный результат, потому что третья строка имеет более высокий приоритет (sort2).

Ожидаемый результат:

|       Name      | id_user | sort1 | sort2 | sort3 | sort4 |
+-----------------+---------+-------+-------+-------+-------|
|  Some Name      |    1    |  NULL |   34  |  NULL |  NULL |
| Some Other Name |    2    |  NULL |  NULL |  NULL |   45  |

Я также пробовал столбцы приоритета GROUP BY id_user и ORDER BY, но я не получил ожидаемого результат

1 Ответ

0 голосов
/ 26 мая 2020

Я изменил вашу таблицу items, добавил поле id

CREATE TABLE `items` (
  `id` int(11) NOT NULL,
  `id_user` int(11) NOT NULL,
  `sort1` int(11) DEFAULT NULL,
  `sort2` int(11) DEFAULT NULL,
  `sort3` int(11) DEFAULT NULL,
  `sort4` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

ALTER TABLE `items` ADD PRIMARY KEY (`id`);

INSERT INTO `items` (`id`, `id_user`, `sort1`, `sort2`, `sort3`, `sort4`) VALUES
(1, 1, NULL, NULL, 39, NULL),
(2, 2, NULL, NULL, NULL, 45),
(3, 1, NULL, 34, NULL, NULL);

Итак, вы можете попробовать такой запрос, я изменил предложение FROM с items на users

SELECT
  users.name,
  items.id,
  items.id_user,
  items.sort1,
  items.sort2,
  items.sort3,
  items.sort4
FROM
  users
LEFT JOIN 
  items ON items.id = (
    SELECT i.id FROM items AS i WHERE i.id_user = users.user_id ORDER BY -i.sort1 DESC, -i.sort2 DESC, -i.sort3 DESC, -i.sort4 DESC LIMIT 1
  )
ORDER BY -items.sort1 DESC, -items.sort2 DESC, -items.sort3 DESC, -items.sort4 DESC

Результат

|            name | id | id_user |  sort1 |  sort2 |  sort3 |  sort4 |
|-----------------|----|---------|--------|--------|--------|--------|
|       Some Name |  3 |       1 | (null) |     34 | (null) | (null) |
| Some Other Name |  2 |       2 | (null) | (null) | (null) |     45 |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...