mysql联合未按预期工作

jq6vz3qz  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(393)

我有table:
流:

+----+-------------------+------------+
| 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          |
+----+-------------------+

我尝试使用union 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是用来把两个表的值合并成一个…所以我想我会得到我需要的这个结果,但正如你在我的示例代码中看到的,我总是从每个表中得到每一行的值..并且需要是对应于channels.sort json value的值之后的值…我正在html5中构建channel ediotor,所以我需要按channels.sort中的定义排列频道和读取频道名称和标记。

k5hmc34c

k5hmc34c1#

我终于做到了!YUPIIII……)

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中的单个查询是错误的..使用detail try and error我终于得到了它..所以如果有人需要代码,这里就是它了

相关问题