【问题标题】:mysql JSON LEFT JOINmysql JSON 左连接
【发布时间】:2017-02-11 15:34:00
【问题描述】:
TABLE streams;

+----+----------+-------------------------------------------------------------+-------------+-------------+
| id | name     | stream                                                      | server      | bouquet     | 
+----+----------+-------------------------------------------------------------+-------------+-------------+
|  1 | HOME     | ["http://ur11.com/", "http://ur12.com/"]                    | ["1", "3"]  | ["3","2"]   |
+----+----------+-------------------------------------------------------------+-------------+-------------+

TABLE servers;

+----+-------------------+
| id | server            |
+----+-------------------+
|  1 | Main              |
|  2 | Server #1         |
|  3 | Server #2         |
|  4 | Server #3         |
|  5 | Server #4         |
+----+-------------------+

我需要在表流上运行 LEFT JOIN 并使用 servers.server 的 stream.server 值中的第一个索引进行检索:

例如,我需要左连接才能得到这个结果:

+----+----------+-------------------------------------------------------------+-------------+-------------+
| id | name     | stream                                                      | server      | bouquet     | 
+----+----------+-------------------------------------------------------------+-------------+-------------+
|  1 | HOME     | ["http://ur11.com/", "http://ur12.com/"]                    | Main        | ["3","2"]   |
+----+----------+-------------------------------------------------------------+-------------+-------------+

所以重点是从streams.server获得第一个索引,女巫是1,然后在servers.id上左连接以获得servers.server名称女巫在这种情况下是Main

我安装了包含 JSON 支持的 mysql 5.7 版本,但我不知道如何在 JSON 字段类型上使用 LEFT JOIN?

【问题讨论】:

    标签: mysql json


    【解决方案1】:

    我想你想要:

    select s.*, se.server
    from streams s join
         servers se
         on se.id = json_extract(s.server, '$[0]');
    

    根据你安装的 MySQL 的具体版本,你也可以使用s.server->'$[0]'

    【讨论】:

    • @John 。 . .您可能不得不摆弄json_extract()。例如,双引号表明 json 字段中的值存储为字符串,而 servers 中的值看起来像 ints。
    【解决方案2】:

    我用你上面的解决方案搞定了:

    select s.*, se.server
    from streams s left join
    servers se
    on se.id = CAST(json_extract(s.server, '$[0]') AS UNSIGNED);
    

    谢谢。

    【讨论】:

      【解决方案3】:

      示例:

      SELECT *
      FROM foo 
      CROSS JOIN LATERAL json_array_elements (foo.bars :: json) foo_bars 
      LEFT OUTER JOIN bar ON (foo_bars ->> 'id') :: BIGINT = bar.ID;
      

      Link

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-13
        • 2012-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-07
        相关资源
        最近更新 更多