【问题标题】:Query not returning distinct JSON column values查询不返回不同的 JSON 列值
【发布时间】:2021-06-26 20:36:05
【问题描述】:

我正在使用MySql 8.0 verion 并有一个table t1,如下所示:

+--------++--------------------------------------------------+
| id     | type               | users                        | 
+--------+--------------------+------------------------------+
| 11     | ["type1", "type2"] | ["user1", "user2", "user3"]  |
| 12     | ["type2", "type4"] | ["user2", "user22", "user3"] |      
+--------+--------------------+------------------------------+

我想创建一个查询来查找表中的所有distinct type。 我编写了以下查询,但它返回一个空白行:

select distinct type
from 
    t1,
    json_table(
        type,
        "$[*]"
        columns (type varchar(50) PATH "$")
    ) t
order by type

查询输出:

+---------------------+
| type                |
+---------------------+
| ["type1", "type2"]  |
| ["type2", "type4"]  |
+---------------------+

期望的输出:

+--------+
| type   |
+--------+
| type1  |
| type2  |
| type4  |
+--------+

【问题讨论】:

    标签: mysql arrays json join select


    【解决方案1】:

    type 列不明确,因为它同时出现在 t1 和 JSON_TABLE 结果中。您应该限定列。

    mysql> select distinct t.type from t1, 
           json_table(type, '$[*]' columns (type varchar(50) PATH '$')) as t 
           order by t.type;
    +-------+
    | type  |
    +-------+
    | type1 |
    | type2 |
    | type4 |
    +-------+
    

    【讨论】:

    • 谢谢。我已经更改了JSON_TABLE column to "types"。但是,此查询最后会返回一个额外的行,其中包含所有类型,例如 ["type1", "type2", "type4"]
    • 当 Json 数组有多个条目时,查询没有返回不同的值
    • 我无法重现该问题,即使我在其中一个数组中有重复值,它也适用于我的情况。
    • 我认为如果表中还有一行包含三个值["type1", "type2", "type4"],那么它也会返回这一行。这样结果不会是唯一的
    • 好的,我不知道你在做什么,但我测试了那个确切的情况,我的结果没有重复。
    【解决方案2】:

    我可以通过写CROSS JOIN来解决它

    SELECT distinct j.type FROM t1
       CROSS JOIN
       JSON_TABLE(t1.type, " $ [*]" 
                    COLUMNS ( type VARCHAR(20) PATH '$' )
                  ) j
    

    【讨论】:

    • CROSS JOIN 和 SQL-89 逗号式连接没有区别。
    • 使用CROSS JOIN 很有帮助,因为它不会将每一行作为数组返回
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    相关资源
    最近更新 更多