SQL 求助, 使用联合查询怎么安装原始顺序显示, 实现下图这样的效果

2022-10-26 17:58:36 +08:00
 zyxk
表 t_name:
id name zone_id
--------------------
3 t1 23,24
4 t2 24,23

表 t_name:
zone_id zone
--------------
23 5 元区
24 10 元区

使用 SQL
select a.id,a.name,a.zone_id,group_concat(b.zone) as zone from t_name as a left join t_zone as b on find_in_set(b.zone_id,a.zone_id) group by a.id
实现的效果
id name zone_id zone
---------------------------
3 t1 23,24 5 元区,10 元区
4 t2 24,23 5 元区,10 元区

使用上面 SQL 实现效果如上, 我想要实现的是 zone 按照 user_id 中的先后顺序显示, 不要被自动排序
zone_id=23,24 时 zone 显示 5 元区,10 元区, zone_id=24,23 时 zone 显示 10 元区 5 元区 下边是想要实现的效果, 请问使用 SQL 怎么实现呢

但是我想要的效果是:
id name zone_id zone
---------------------------
3 t1 23,24 5 元区,10 元区
4 t2 24,23 10 元区,5 元区


图文版
https://docs.qq.com/doc/DUHFKa1pnWlZldElC
1421 次点击
所在节点    MySQL
8 条回复
zyxk
2022-10-26 18:19:25 +08:00
标题 安装=按照
sun522198558
2022-10-26 18:29:47 +08:00
外层在加个左连
wxf666
2022-10-26 19:08:41 +08:00
用 json 函数试试?

`SQLite` 测试通过:*(`MySQL` 可用 `json_table`。V 站排版原因,行首有全角空格)*

```sqlite
WITH
  t_name(id, name, zone_id) AS (
   VALUES
   (3, 't1', '23,24'),
   (4, 't2', '24,23')
 ),

  t_zone(zone_id, zone) AS (
   VALUES
   (23, '5 元区'),
   (24, '10 元区')
 )

SELECT a.id, a.name, a.zone_id, b.value, GROUP_CONCAT(c.zone)
  FROM t_name a
  JOIN json_each(format('[%s]', a.zone_id)) b
  LEFT JOIN t_zone c ON b.value = c.zone_id -- 只能 LEFT JOIN 。怀疑是 JOIN 时,b 表会提前排好序,加速 b.id = c.id 匹配
GROUP BY a.id;
```
zyxk
2022-10-26 19:51:31 +08:00
@wxf666 #3
不好意思, 我没有用过 json_table, 不知道什么原因, SQLite 和 MySQL 上, 都不行, 如下图, 我稍后查询一下 json_table format 怎么使用.
https://imgur.com/B7l81In
wxf666
2022-10-26 20:15:01 +08:00
@zyxk `SQLite` 咋可能不行。。

`MySQL` 语法:*(就是觉得 `json_table` 繁杂,懒得查文档才用的 `SQLite`。。V 站排版原因,行首有全角空格)*

```mysql
WITH
  t_name(id, name, zone_id) AS (
   VALUES
    ROW(3, 't1', '23,24'),
    ROW(4, 't2', '24,23')
 ),

  t_zone(zone_id, zone) AS (
   VALUES
    ROW(23, '5 元区'),
    ROW(24, '10 元区')
 )
 
SELECT a?id, a?name, a?zone_id, group_concat(c?zone) AS zone
FROM t_name AS a
JOIN json_table(concat('[', a?zone_id, ']'), '$[*]' COLUMNS(zone_id INT PATH '$')) AS b
JOIN t_zone AS c ON b?zone_id = c?zone_id
GROUP BY a?id
```

我是数据库新手,不知这是不是奇技淫巧。或许你等大佬来指出真正问题所在才是正道。。


V 站告诉我:

创建新回复过程中遇到一些问题:

- 请不要在每一个回复中都包括外链,这看起来像是在 spamming

我把所有的 . 换成 ? 了,记得替换回来
zyxk
2022-10-26 23:37:13 +08:00
@wxf666 #5 感谢, 空格去了, SQlite 的不行, 不过无所谓了, MySQL 是正常的, 只是需要更新 MySQL8 , 我要测试下我的程序和 MySQL8 的兼容性和性能, 不知道性能怎么样, 再次非常感谢.
nuanshen
2022-10-27 14:23:07 +08:00
mysq 的话简单,group_concat 里是可以指定排序的,group_concat(b.zone order by find_in_set(b.zone_id,a.zone_id))
zyxk
2022-10-27 14:33:38 +08:00
@nuanshen #7 感谢, 可以的.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/890113

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX