SQL 求助, 使用联合查询怎么安装原始顺序显示, 实现下图这样的效果 - V2EX
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
0.02D
V2EX    MySQL

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

  •  
  •   zyxk 2022-10-26 17:58:36 +08:00 1794 次点击
    这是一个创建于 1150 天前的主题,其中的信息可能已经有所发展或是发生改变。
    表 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     Solana     2735 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 03:09 PVG 11:09 LAX 19:09 JFK 22:09
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86