У меня есть таблицы:
Потоки:
+----+-------------------+------------+
| 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.
Я, наконец, сделал это! 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 ошибочен..используя детальную попытку и ошибку, я получил его наконец.. так, если кому-то нужен код, вот он
я 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'
title
столбца, то почему вы включили его в операторselect