› 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 · Oct 26, 2022 · 2289 views
    This topic created in 1436 days ago, the information mentioned may be changed or developed.
    表 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 replies  •  2022-10-27 14:33:38 +08:00
    zyxk
        1
    zyxk  
    OP
       Oct 26, 2022
    标题 安装=按照
    sun522198558
        2
    sun522198558  
       Oct 26, 2022   ❤️ 1
    外层在加个左连
    wxf666
        3
    wxf666  
       Oct 26, 2022
    用 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
       Oct 26, 2022
    @wxf666 #3
    不好意思, 我没有用过 json_table, 不知道什么原因, SQLite 和 MySQL 上, 都不行, 如下图, 我稍后查询一下 json_table format 怎么使用.
    https://imgur.com/B7l81In
    wxf666
        5
    wxf666  
       Oct 26, 2022   ❤️ 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
       Oct 26, 2022
    @wxf666 #5 感谢, 空格去了, SQlite 的不行, 不过无所谓了, MySQL 是正常的, 只是需要更新 MySQL8 , 我要测试下我的程序和 MySQL8 的兼容性和性能, 不知道性能怎么样, 再次非常感谢.
    nuanshen
        7
    nuanshen  
       Oct 27, 2022   ❤️ 1
    mysq 的话简单,group_concat 里是可以指定排序的,group_concat(b.zone order by find_in_set(b.zone_id,a.zone_id))
    zyxk
        8
    zyxk  
    OP
       Oct 27, 2022
    @nuanshen #7 感谢, 可以的.
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2442 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 02:14 · PVG 10:14 · LAX 19:14 · JFK 22:14
    ♥ Do have faith in what you're doing.