MySQL Union не работает, как ожидалось

0

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

Потоки:

+----+-------------------+------------+
| id | channel           | bouquet    |
+----+-------------------+------------+
|  1 | USA_CH 1          | ["1","28"] |
|  2 | USA_CH 2          | ["1","28"] |
| 11 | USA_CH 3          | ["1"]      |
| 12 | USA_CH 4          | ["28"]     |
+----+-------------------+------------+

Каналы:

+----+--------------------------+---------+----------+
| id | sort                     | bouquet | reseller |
+----+--------------------------+---------+----------+
|  1 | ["m1","1","2","m2","11"] | ["1"]   |        0 |
| 27 | ["1","2"]                | ["28"]  |        0 |
| 39 | []                       | ["33"]  |        0 |
+----+--------------------------+---------+----------+

Маркеры:

+----+--------+-------+---------+----------+
| id | marker | title | bouquet | reseller |
+----+--------+-------+---------+----------+
|  1 | m1     | MEGA  |       1 |        1 |
+----+--------+-------+---------+----------+
|  2 | m2     | XTRA  |       1 |        1 |
+----+--------+-------+---------+----------+

И нужно получить порядок каналов с маркером из поля сортировки таблиц каналов:

["m1","1","2","m2","11"]

Поэтому мне нужно получить вывод следующим образом:

+----+-------------------+
| id | channel           |
+----+-------------------+
|  1 | MEGA              |
|  1 | USA_CH 1          |
|  2 | USA_CH 2          |
|  2 | XTRA              |
| 11 | USA_CH 3          |
+----+-------------------+

Я пытаюсь использовать союз SQL:

SELECT s.id, s.channel, m.title FROM streams s, markers m, channels c WHERE JSON_SEARCH(s.bouquet, 'one', '1') IS NOT NULL AND 
JSON_SEARCH(c.bouquet, 'one', '1') IS NOT NULL AND JSON_SEARCH(c.sort, 'one', s.id) IS NOT NULL
UNION 
SELECT s.id, s.channel, m.title FROM streams s, markers m, channels c WHERE JSON_SEARCH(c.sort, 'one', m.marker) IS NOT NULL AND
JSON_SEARCH(s.bouquet, 'one', '1') IS NOT NULL;

И я понимаю:

 +----+----------+-------+
  | id | channel  | title |
  +----+----------+-------+
  |  1 | USA_CH 1 | MEGA  |
  |  2 | USA_CH 2 | MEGA  |
  | 11 | USA_CH 3 | XTRA  |
  +----+----------+-------+

И мне нужно это сделать:

+----+-------------------+
| id | channel           |
+----+-------------------+
|  1 | MEGA              |
|  1 | USA_CH 1          |
|  2 | USA_CH 2          |
|  2 | XTRA              |
| 11 | USA_CH 3          |
+----+-------------------+

Что я сделал неправильно? Я прочитал в руководстве mysql, что UNION предназначен для объединения двух значений таблиц в один... поэтому я думал, что я получу этот результат, который мне нужен, но, как вы видите в моем примере кода, я получаю всегда из каждой таблицы значение каждой строки. и должен быть значением после значения, соответствующего каналам. sort json value... я im build channel ediotor в html5, поэтому мне нужно получить упорядочение каналов и чтение каналов имени и маркеров, как определено в channels.sort.

  • 0
    Почему бы не нормализовать вашу схему?
  • 0
    если вы не хотите выбирать title столбца, то почему вы включили его в оператор select
Показать ещё 3 комментария
Теги:
union

2 ответа

0
Лучший ответ

Я, наконец, сделал это! Yupiiiii.... :)

SELECT id, sort, channel FROM
(
SELECT s.id, c.sort, s.channel FROM streams s, channels c
WHERE JSON_SEARCH(s.bouquet, 'one', '1') IS NOT NULL AND
JSON_SEARCH(c.bouquet, 'one', '1') IS NOT NULL AND JSON_SEARCH(c.sort, 'one', s.id) IS NOT NULL
UNION
SELECT m.marker, c.sort, m.channel FROM markers m, channels c, streams s
WHERE JSON_SEARCH(m.bouquet, 'one', '1') IS NOT NULL AND
JSON_SEARCH(c.bouquet, 'one', '1') IS NOT NULL AND JSON_SEARCH(c.sort, 'one', m.marker) IS NOT NULL
) A
ORDER BY LOCATE(id, CONCAT("'", sort, "'"));

И я получил хороший результат:

+----+--------------------------+----------+
| id | sort                     | channel  |
+----+--------------------------+----------+
| m1 | ["m1","1","2","m2","11"] | MEGA     |
| 1  | ["m1","1","2","m2","11"] | USA_CH 1 |
| 2  | ["m1","1","2","m2","11"] | USA_CH 2 |
| m2 | ["m1","1","2","m2","11"] | XTRA     |
| 11 | ["m1","1","2","m2","11"] | USA_CH 3 |
+----+--------------------------+----------+

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

0

я modifiy Query, и теперь он возвращает правильные значения из двух таблиц, но ORDER BY не работает. Потому что я использую UNION. Как я могу использовать ORDER BY в этом запросе?

SELECT channel FROM
(
SELECT s.channel FROM streams s, channels c
WHERE JSON_SEARCH(s.bouquet, 'one', '1') IS NOT NULL AND
JSON_SEARCH(c.bouquet, 'one', '1') IS NOT NULL AND JSON_SEARCH(c.sort, 'one', s.id) IS NOT NULL
UNION
SELECT m.channel FROM markers m, channels c
WHERE JSON_SEARCH(m.bouquet, 'one', '1') IS NOT NULL AND
JSON_SEARCH(c.bouquet, 'one', '1') IS NOT NULL AND JSON_SEARCH(c.sort, 'one', m.marker) IS NOT NULL
) A;

Используя вышеприведенный запрос, я получаю следующее:

+-------------------+
| channel           |
+-------------------+
| USA_CH 1          |
| USA_CH 2          |
| USA_CH 3          |
| MEGA              |
| XTRA              |
+-------------------+

И мне нужно это сделать:

+----+-------------------+
| id | channel           |
+----+-------------------+
|  1 | MEGA              |
|  1 | USA_CH 1          |
|  2 | USA_CH 2          |
|  2 | XTRA              |
| 11 | USA_CH 3          |
+----+-------------------+

Добавление в конце запроса:

ORDER BY LOCATE(s.id, CONCAT("'", c.sort, "'"))

Я получаю ошибку об ошибке:

ERROR 1054 (42S22): Unknown column 'c.sort' in 'order clause'

Ещё вопросы

Сообщество Overcoder
Наверх
Меню