V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
zyxk
V2EX  ›  MySQL

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

  •  
  •   zyxk · 2022-10-26 17:58:36 +08:00 · 1429 次点击
    这是一个创建于 757 天前的主题,其中的信息可能已经有所发展或是发生改变。
    表 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
    8 条回复    2022-10-27 14:33:38 +08:00
    zyxk
        1
    zyxk  
    OP
       2022-10-26 18:19:25 +08:00
    标题 安装=按照
    sun522198558
        2
    sun522198558  
       2022-10-26 18:29:47 +08:00   ❤️ 1
    外层在加个左连
    wxf666
        3
    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
        4
    zyxk  
    OP
       2022-10-26 19:51:31 +08:00
    @wxf666 #3
    不好意思, 我没有用过 json_table, 不知道什么原因, SQLite 和 MySQL 上, 都不行, 如下图, 我稍后查询一下 json_table format 怎么使用.
    https://imgur.com/B7l81In
    wxf666
        5
    wxf666  
       2022-10-26 20:15:01 +08:00   ❤️ 1
    @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
        6
    zyxk  
    OP
       2022-10-26 23:37:13 +08:00
    @wxf666 #5 感谢, 空格去了, SQlite 的不行, 不过无所谓了, MySQL 是正常的, 只是需要更新 MySQL8 , 我要测试下我的程序和 MySQL8 的兼容性和性能, 不知道性能怎么样, 再次非常感谢.
    nuanshen
        7
    nuanshen  
       2022-10-27 14:23:07 +08:00   ❤️ 1
    mysq 的话简单,group_concat 里是可以指定排序的,group_concat(b.zone order by find_in_set(b.zone_id,a.zone_id))
    zyxk
        8
    zyxk  
    OP
       2022-10-27 14:33:38 +08:00
    @nuanshen #7 感谢, 可以的.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4377 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 04:05 · PVG 12:05 · LAX 20:05 · JFK 23:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.