MySQL выбирает из и показывает результаты без маркера - PullRequest
0 голосов
/ 02 июня 2019

У меня есть таблица:

+----+-------------------+
| id | channel           |
+----+-------------------+
| m2 | AA-AA             |
| 1  | KR_A 1            |
| 2  | KR_A 2            |
| 11 | HR_A 3            |
| 12 | HR_B 1            |
| m4 | BB-BB             |
| m3 | CC-CC             |
| 17 | SR_B 1            |
| m5 | DD-DD             |
| m1 | EE-EE             |
+----+-------------------+

Когда я добавляю m2 запрос должен вернуть:

1
2
11
12

Поэтому я использую этот запрос:

SET @showChannels:=0;
SELECT id, channel
FROM table
WHERE
(
   @showChannels:=( (id like 'm%' and id = 'm2' and @showChannels) or (id not like 'm%' ) )
)
AND id not like 'm%';

Это правильно возвращает выше желаемых результатов.

Проблема в том, что когда я добавляю m3 к запросу, мне нужно получить это:

17

НО я получаю всегда:

1
2
11
12

И это не правильно, потому что мне нужно получить только 17 значений ... может быть какая-нибудь помощь, чтобы изменить его для работы?Я пытаюсь сегодня 4 часа и не смог достичь желаемого результата.

Ответы [ 2 ]

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

С минимальными изменениями вы можете добавить столбец сортировки в вашу таблицу и обновить значения до тех значений, которые вам нужны, которые отражают правильную сортировку:

ALTER TABLE table ADD COLUMN sort_seq INTEGER;

UPDATE table SET sort_seq = 1 WHERE id = 'm2';
UPDATE table SET sort_seq = 2 WHERE id = '1';
UPDATE table SET sort_seq = 3 WHERE id = '2';
UPDATE table SET sort_seq = 4 WHERE id = '11';
UPDATE table SET sort_seq = 5 WHERE id = '12';
UPDATE table SET sort_seq = 6 WHERE id = 'm4';
UPDATE table SET sort_seq = 7 WHERE id = 'm3';
UPDATE table SET sort_seq = 8 WHERE id = '17';
UPDATE table SET sort_seq = 9 WHERE id = 'm5';
UPDATE table SET sort_seq = 10 WHERE id = 'm1';

Однако основная проблема, с которой вы сталкиваетесьв том, что вам нужно сделать обратную ссылку на «маркер» какого-то рода.Лучшим способом сделать это было бы иметь способ сгруппировать ваши записи.Вы можете сделать это, добавив таблицу поиска для групп для своих записей:

+----+-------------------+--------+--------+
| id | channel           |  grp   |  sort  |
+----+-------------------+--------+--------+
| m2 | AA-AA             |   m2   |    1   |
| 1  | KR_A 1            |   m2   |    2   |
| 2  | KR_A 2            |   m2   |    3   |
| 11 | HR_A 3            |   m2   |    4   |
| 12 | HR_B 1            |   m2   |    5   |
| m4 | BB-BB             |   m4   |    6   |
| m3 | CC-CC             |   m3   |    7   |
| 17 | SR_B 1            |   m3   |    8   |
| m5 | DD-DD             |   m5   |    9   |
| m1 | EE-EE             |   m1   |   10   |
+----+-------------------+--------+--------+

+----+--------------------+--------+
| id | group_desc         |  sort  |
+----+--------------------+--------+
| m1 | Description for m1 |   1    |
| m2 | Description for m2 |   2    |
| m3 | Description for m3 |   3    |
| m4 | Description for m4 |   4    |
| m5 | Description for m5 |   5    |
+----+--------------------+--------+

Затем вы можете JOIN на этой таблице выбрать только элементы, принадлежащие вашей группе и / или отсортировать по этой группе.

SELECT c.id, c.channel
FROM channels c
JOIN channel_groups cg
ON cg.id = c.grp
AND c.id <> cg.id
WHERE cg.id = 'm2'
ORDER BY c.sort;

Или вы можете использовать аналогичный запрос, но вы можете идентифицировать групповой канал как основной, используя предложение WHERE:

SELECT c.id, c.channel, CASE WHEN c.id = cg.id THEN 1 ELSE 0 END AS primary
FROM channels c
JOIN channel_group cg
ON cg.id = c.grp
ORDER BY c.sort;
0 голосов
/ 10 июня 2019
+----+-------------------+--------+
| id | channel           |  seq   |
+----+-------------------+--------+
| m2 | AA-AA             |   m2   |
| 1  | KR_A 1            |   1    |
| 2  | KR_A 2            |   2    |
| 11 | HR_A 3            |  11    |
| 12 | HR_B 1            |  12    |
| m4 | BB-BB             |  m4    |
| m3 | CC-CC             |  m3    |
| 17 | SR_B 1            |  17    |
| m5 | DD-DD             |  m5    |
| m1 | EE-EE             |  m1    |
+----+-------------------+--------+

Я добавил seq таблиц sugessted от gmiley, но не уверен, что он может содержать маркеры m%, потому что это NUMBER тип столбца seq, поэтому я не уверен, правильно ли я это сделал.

Еще один вопрос, о котором я думаю, почему я не могу использовать, например, BETWEEN, например:

SELECT id, channel
FROM table
WHERE id BETWEEN 'm2' AND 'm%'
AND id NOT LIKE 'm%';

Таким образом, это будет более просто, потому что он будет выбирать из m2 до следующего значения маркера m

Более важным является то, что столбец сортировки имеет следующий порядок:

["m2","1","2","11","12","m4","m3","17", "m5","m1"]

в базе данных MySQL, поэтому ее тип - TEXT, возможно, ее будет просто опустить до ...

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