关于Mysql json格式数据的查询一些记录

select * from nw_wechat_order where JSON_CONTAINS(goods_info->'$[*].title', '"秋裤2"', '$') or goods_info->'$.title' = '秋裤2'

JSON_CONTAINS(targetcandidate[, path])

通过返回1或0来指示给定的 candidateJSON文档是否包含在targetJSON文档中,或者 - 如果提供了path 参数 - 是否在目标内的特定路径中找到候选项。返回 NULL如果任何参数 NULL,或者如果路径参数不识别目标文档的一部分。如果发生错误 target或 candidate不是有效的JSON文档,或者如果path参数不是一个有效的路径表达式或包含一个*或**通配符。

要仅检查路径中是否存在任何数据,请 JSON_CONTAINS_PATH()改用。

以下规则定义了遏制:

候选标量包含在目标标量中,当且仅当它们具有可比性且相等时。如果它们具有相同的JSON_TYPE()类型,则两个标量值是可比较的 ,除了类型的值INTEGER 并且DECIMAL也彼此相当。

当且仅当候选中的每个元素都包含在目标的某个元素中时,候选数组才包含在目标数组中。

当且仅当候选者包含在目标的某个元素中时,候选非阵列包含在目标数组中。

候选对象包含在目标对象中,当且仅当对于候选中的每个键时,在目标中存在具有相同名称的键,并且与候选键相关联的值包含在与目标键相关联的值中。

否则,候选值不包含在目标文档中。

mysql>SET@j='{"a": 1, "b": 2, "c": {"d": 4}}';mysql>SET@j2='1';mysql>SELECTJSON_CONTAINS(@j,@j2,'$.a');+-------------------------------+|JSON_CONTAINS(@j, @j2, '$.a')|+-------------------------------+|1|+-------------------------------+mysql>SELECTJSON_CONTAINS(@j,@j2,'$.b');+-------------------------------+|JSON_CONTAINS(@j, @j2, '$.b')|+-------------------------------+|0|+-------------------------------+mysql>SET@j2='{"d": 4}';mysql>SELECTJSON_CONTAINS(@j,@j2,'$.a');+-------------------------------+|JSON_CONTAINS(@j, @j2, '$.a')|+-------------------------------+|0|+-------------------------------+mysql>SELECTJSON_CONTAINS(@j,@j2,'$.c');+-------------------------------+|JSON_CONTAINS(@j, @j2, '$.c')|+-------------------------------+|1|+-------------------------------+

JSON_CONTAINS_PATH(json_docone_or_allpath[, path] ...)

返回0或1以指示JSON文档是否包含给定路径或路径的数据。NULL 如果有任何参数,则返回NULL。如果json_doc参数不是有效的JSON文档,任何path 参数不是有效的路径表达式,或者one_or_all不是 'one'或, 则会发生错误'all'。

要检查路径中的特定值,请 JSON_CONTAINS()改用。

如果文档中不存在指定的路径,则返回值为0。否则,返回值取决于 one_or_all参数:

'one':如果文档中至少存在一个路径,则为1,否则为0。

'all':如果文档中存在所有路径,则为1,否则为0。

mysql>SET@j='{"a": 1, "b": 2, "c": {"d": 4}}';mysql>SELECTJSON_CONTAINS_PATH(@j,'one','$.a','$.e');+---------------------------------------------+|JSON_CONTAINS_PATH(@j, 'one', '$.a', '$.e')|+---------------------------------------------+|1|+---------------------------------------------+mysql>SELECTJSON_CONTAINS_PATH(@j,'all','$.a','$.e');+---------------------------------------------+|JSON_CONTAINS_PATH(@j, 'all', '$.a', '$.e')|+---------------------------------------------+|0|+---------------------------------------------+mysql>SELECTJSON_CONTAINS_PATH(@j,'one','$.c.d');+----------------------------------------+|JSON_CONTAINS_PATH(@j, 'one', '$.c.d')|+----------------------------------------+|1|+----------------------------------------+mysql>SELECTJSON_CONTAINS_PATH(@j,'one','$.a.d');+----------------------------------------+|JSON_CONTAINS_PATH(@j, 'one', '$.a.d')|+----------------------------------------+|0|+----------------------------------------+

JSON_EXTRACT(json_docpath[, path] ...)

返回JSON文档中的数据,该文档从path 参数匹配的文档部分中选择。返回NULL如果任何参数 NULL或没有路径找到文档中的一个值。如果json_doc参数不是有效的JSON文档或任何path参数不是有效的路径表达式,则会发生错误 。

返回值由path参数匹配的所有值组成 。如果这些参数可能返回多个值,则匹配的值将按照与生成它们的路径对应的顺序自动包装为数组。否则,返回值是单个匹配的值。

mysql>SELECTJSON_EXTRACT('[10, 20, [30, 40]]','$[1]');+--------------------------------------------+|JSON_EXTRACT('[10, 20, [30, 40]]', '$[1]')|+--------------------------------------------+|20|+--------------------------------------------+mysql>SELECTJSON_EXTRACT('[10, 20, [30, 40]]','$[1]','$[0]');+----------------------------------------------------+|JSON_EXTRACT('[10, 20, [30, 40]]', '$[1]', '$[0]')|+----------------------------------------------------+|[20, 10]|+----------------------------------------------------+mysql>SELECTJSON_EXTRACT('[10, 20, [30, 40]]','$[2][*]');+-----------------------------------------------+|JSON_EXTRACT('[10, 20, [30, 40]]', '$[2][*]')|+-----------------------------------------------+|[30, 40]|+-----------------------------------------------+

MySQL 5.7.9及更高版本支持 -> 运算符作为此函数的简写,与2个参数一起使用,其中左侧是 JSON列标识符(不是表达式),右侧是要在列中匹配的JSON路径。

column->path

在MySQL 5.7.9及更高版本中,当与两个参数一起使用时, -> 运算符用作JSON_EXTRACT()函数的别名, 左边是列标识符,右边是JSON路径,根据JSON文档(列值)计算。您可以使用此类表达式代替SQL语句中出现的列标识符。

SELECT这里显示 的两个语句产生相同的输出:

mysql>SELECTc,JSON_EXTRACT(c,"$.id"),g>FROMjemp>WHEREJSON_EXTRACT(c,"$.id")>1>ORDERBYJSON_EXTRACT(c,"$.name");+-------------------------------+-----------+------+|c|c->"$.id"|g|+-------------------------------+-----------+------+|{"id": "3", "name": "Barney"}|"3"|3||{"id": "4", "name": "Betty"}|"4"|4||{"id": "2", "name": "Wilma"}|"2"|2|+-------------------------------+-----------+------+3 rows in set (0.00 sec)mysql>SELECTc,c->"$.id",g>FROMjemp>WHEREc->"$.id">1>ORDERBYc->"$.name";+-------------------------------+-----------+------+|c|c->"$.id"|g|+-------------------------------+-----------+------+|{"id": "3", "name": "Barney"}|"3"|3||{"id": "4", "name": "Betty"}|"4"|4||{"id": "2", "name": "Wilma"}|"2"|2|+-------------------------------+-----------+------+3 rows in set (0.00 sec)

此功能不限 SELECT于此,如下所示:

mysql>ALTERTABLEjempADDCOLUMNnINT;Query OK, 0 rows affected (0.68 sec)Records: 0  Duplicates: 0  Warnings: 0mysql>UPDATEjempSETn=1WHEREc->"$.id"="4";Query OK, 1 row affected (0.04 sec)Rows matched: 1  Changed: 1  Warnings: 0mysql>SELECTc,c->"$.id",g,n>FROMjemp>WHEREJSON_EXTRACT(c,"$.id")>1>ORDERBYc->"$.name";+-------------------------------+-----------+------+------+|c|c->"$.id"|g|n|+-------------------------------+-----------+------+------+|{"id": "3", "name": "Barney"}|"3"|3|NULL||{"id": "4", "name": "Betty"}|"4"|4|1||{"id": "2", "name": "Wilma"}|"2"|2|NULL|+-------------------------------+-----------+------+------+3 rows in set (0.00 sec)mysql>DELETEFROMjempWHEREc->"$.id"="4";Query OK, 1 row affected (0.04 sec)mysql>SELECTc,c->"$.id",g,n>FROMjemp>WHEREJSON_EXTRACT(c,"$.id")>1>ORDERBYc->"$.name";+-------------------------------+-----------+------+------+|c|c->"$.id"|g|n|+-------------------------------+-----------+------+------+|{"id": "3", "name": "Barney"}|"3"|3|NULL||{"id": "2", "name": "Wilma"}|"2"|2|NULL|+-------------------------------+-----------+------+------+2 rows in set (0.00 sec)

(有关用于创建和填充刚刚显示的表的语句,请参阅索引生成的列以提供JSON列索引。)

这也适用于JSON数组值,如下所示:

mysql>CREATETABLEtj10(aJSON,bINT);Query OK, 0 rows affected (0.26 sec)mysql>INSERTINTOtj10>VALUES("[3,10,5,17,44]",33),("[3,10,5,17,[22,44,66]]",0);Query OK, 1 row affected (0.04 sec)mysql>SELECTa->"$[4]"FROMtj10;+--------------+|a->"$[4]"|+--------------+|44||[22, 44, 66]|+--------------+2 rows in set (0.00 sec)mysql>SELECT*FROMtj10WHEREa->"$[0]"=3;+------------------------------+------+|a|b|+------------------------------+------+|[3, 10, 5, 17, 44]|33||[3, 10, 5, 17, [22, 44, 66]]|0|+------------------------------+------+2 rows in set (0.00 sec)

支持嵌套数组。使用的表达式 ->计算NULL 好像在目标JSON文档中找不到匹配的键,如下所示:

mysql>SELECT*FROMtj10WHEREa->"$[4][1]"ISNOTNULL;+------------------------------+------+|a|b|+------------------------------+------+|[3, 10, 5, 17, [22, 44, 66]]|0|+------------------------------+------+mysql>SELECTa->"$[4][1]"FROMtj10;+--------------+|a->"$[4][1]"|+--------------+|NULL||44|+--------------+2 rows in set (0.00 sec)

这与使用时的情况相同 JSON_EXTRACT():

mysql>SELECTJSON_EXTRACT(a,"$[4][1]")FROMtj10;+----------------------------+|JSON_EXTRACT(a, "$[4][1]")|+----------------------------+|NULL||44|+----------------------------+2 rows in set (0.00 sec)

column->>path

这是一个改进的,不引用的提取操作符,可在MySQL 5.7.13及更高版本中使用。而 ->操作者简单地提取的值时, ->>在加法运算unquotes所提取的结果。换句话说,给定 JSON列值 column和路径表达式 path,以下三个表达式返回相同的值:

JSON_UNQUOTE( JSON_EXTRACT(columnpath) )

JSON_UNQUOTE(column -> path)

column->>path

该->>操作可用于任何 JSON_UNQUOTE(JSON_EXTRACT())将被允许。这包括(但不限于) SELECT列表,WHERE和 HAVING条款,并ORDER BY和GROUP BY条款。

接下来的几个语句演示->>了mysql客户端中其他表达式的一些 运算符等价:

mysql>SELECT*FROMjempWHEREg>2;+-------------------------------+------+|c|g|+-------------------------------+------+|{"id": "3", "name": "Barney"}|3||{"id": "4", "name": "Betty"}|4|+-------------------------------+------+2 rows in set (0.01 sec)mysql>SELECTc->'$.name'ASname    ->FROMjempWHEREg>2;+----------+|name|+----------+|"Barney"||"Betty"|+----------+2 rows in set (0.00 sec)mysql>SELECTJSON_UNQUOTE(c->'$.name')ASname    ->FROMjempWHEREg>2;+--------+|name|+--------+|Barney||Betty|+--------+2 rows in set (0.00 sec)mysql>SELECTc->>'$.name'ASname    ->FROMjempWHEREg>2;+--------+|name|+--------+|Barney||Betty|+--------+2 rows in set (0.00 sec)

请参阅索引生成的列以提供JSON列索引,用于在jemp刚刚显示的示例集中创建和填充表的SQL语句 。

此运算符也可以与JSON数组一起使用,如下所示:

mysql>CREATETABLEtj10(aJSON,bINT);Query OK, 0 rows affected (0.26 sec)mysql>INSERTINTOtj10VALUES    ->('[3,10,5,"x",44]',33),    ->('[3,10,5,17,[22,"y",66]]',0);Query OK, 2 rows affected (0.04 sec)Records: 2  Duplicates: 0  Warnings: 0mysql>SELECTa->"$[3]",a->"$[4][1]"FROMtj10;+-----------+--------------+|a->"$[3]"|a->"$[4][1]"|+-----------+--------------+|"x"|NULL||17|"y"|+-----------+--------------+2 rows in set (0.00 sec)mysql>SELECTa->>"$[3]",a->>"$[4][1]"FROMtj10;+------------+---------------+|a->>"$[3]"|a->>"$[4][1]"|+------------+---------------+|x|NULL||17|y|+------------+---------------+2 rows in set (0.00 sec)

与此同时 ->,->>运算符总是在输出中展开EXPLAIN,如下例所示:

mysql>EXPLAINSELECTc->>'$.name'ASname    ->FROMjempWHEREg>2\G***************************1. row***************************id:1  select_type:SIMPLE        table:jemp  partitions:NULL        type:rangepossible_keys:i          key:i      key_len:5          ref:NULL        rows:2    filtered:100.00        Extra:Using where1 row in set, 1 warning (0.00 sec)mysql>SHOWWARNINGS\G***************************1. row***************************Level:Note  Code:1003Message:/*select#1*/ selectjson_unquote(json_extract(`jtest`.`jemp`.`c`,'$.name')) AS `name` from`jtest`.`jemp` where (`jtest`.`jemp`.`g` > 2)1 row in set (0.00 sec)

这类似于MySQL -> 在相同情况下扩展 运算符的方式。

该->>操作符已添加到MySQL 5.7.13中。

JSON_KEYS(json_doc[, path])

从JSON对象的顶级值返回键作为JSON数组,或者,如果path 给出参数,则返回所选路径中的顶级键。NULL如果有任何参数NULL,则返回参数 ,该 json_doc参数不是对象,或者path,如果给定,则不返回对象。如果json_doc参数不是有效的JSON文档或path参数不是有效的路径表达式或包含 *或**通配符,则会发生错误 。

如果所选对象为空,则结果数组为空。如果顶级值具有嵌套的子对象,则返回值不包括来自这些子对象的键。

mysql>SELECTJSON_KEYS('{"a": 1, "b": {"c": 30}}');+---------------------------------------+|JSON_KEYS('{"a": 1, "b": {"c": 30}}')|+---------------------------------------+|["a", "b"]|+---------------------------------------+mysql>SELECTJSON_KEYS('{"a": 1, "b": {"c": 30}}','$.b');+----------------------------------------------+|JSON_KEYS('{"a": 1, "b": {"c": 30}}', '$.b')|+----------------------------------------------+|["c"]|+----------------------------------------------+

JSON_SEARCH(json_docone_or_allsearch_str[, escape_char[, path] ...])

返回JSON文档中给定字符串的路径。NULL如果任何,或者 参数是 json_doc, 则 返回; 文件中不存在; 或者 没找到。发生错误时,如果参数不是一个有效的JSON文档,任何 参数不是一个有效的路径表达式, 是不 或,或者 是不是一个常量表达式。 search_strpathNULLpathsearch_strjson_docpathone_or_all'one''all'escape_char

one_or_all参数影响搜索,如下所示:

'one':搜索在第一个匹配后终止,并返回一个路径字符串。未定义哪个匹配首先考虑。

'all':搜索返回所有匹配的路径字符串,以便不包含重复的路径。如果有多个字符串,则将它们自动包装为数组。数组元素的顺序未定义。

search_str搜索字符串参数中,%和_ 字符用于LIKE 运算符:%匹配任意数量的字符(包括零个字符),并且只 _匹配一个字符。

To specify a literal % or _ character in the search string, precede it by the escape character. The default is \ if the escape_char argument is missing or NULL. Otherwise,escape_char must be a constant that is empty or one character.

For more information about matching and escape character behavior, see the description of LIKE in Section 12.5.1, “String Comparison Functions and Operators”. For escape character handling, a difference from the LIKE behavior is that the escape character for JSON_SEARCH() must evaluate to a constant at compile time, not just at execution time. For example, if JSON_SEARCH() is used in a prepared statement and the escape_char argument is supplied using a ? parameter, the parameter value might be constant at execution time, but is not at compile time.

mysql>SET@j='["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]';mysql>SELECTJSON_SEARCH(@j,'one','abc');+-------------------------------+|JSON_SEARCH(@j, 'one', 'abc')|+-------------------------------+|"$[0]"|+-------------------------------+mysql>SELECTJSON_SEARCH(@j,'all','abc');+-------------------------------+|JSON_SEARCH(@j, 'all', 'abc')|+-------------------------------+|["$[0]", "$[2].x"]|+-------------------------------+mysql>SELECTJSON_SEARCH(@j,'all','ghi');+-------------------------------+|JSON_SEARCH(@j, 'all', 'ghi')|+-------------------------------+|NULL|+-------------------------------+mysql>SELECTJSON_SEARCH(@j,'all','10');+------------------------------+|JSON_SEARCH(@j, 'all', '10')|+------------------------------+|"$[1][0].k"|+------------------------------+mysql>SELECTJSON_SEARCH(@j,'all','10',NULL,'$');+-----------------------------------------+|JSON_SEARCH(@j, 'all', '10', NULL, '$')|+-----------------------------------------+|"$[1][0].k"|+-----------------------------------------+mysql>SELECTJSON_SEARCH(@j,'all','10',NULL,'$[*]');+--------------------------------------------+|JSON_SEARCH(@j, 'all', '10', NULL, '$[*]')|+--------------------------------------------+|"$[1][0].k"|+--------------------------------------------+mysql>SELECTJSON_SEARCH(@j,'all','10',NULL,'$**.k');+---------------------------------------------+|JSON_SEARCH(@j, 'all', '10', NULL, '$**.k')|+---------------------------------------------+|"$[1][0].k"|+---------------------------------------------+mysql>SELECTJSON_SEARCH(@j,'all','10',NULL,'$[*][0].k');+-------------------------------------------------+|JSON_SEARCH(@j, 'all', '10', NULL, '$[*][0].k')|+-------------------------------------------------+|"$[1][0].k"|+-------------------------------------------------+mysql>SELECTJSON_SEARCH(@j,'all','10',NULL,'$[1]');+--------------------------------------------+|JSON_SEARCH(@j, 'all', '10', NULL, '$[1]')|+--------------------------------------------+|"$[1][0].k"|+--------------------------------------------+mysql>SELECTJSON_SEARCH(@j,'all','10',NULL,'$[1][0]');+-----------------------------------------------+|JSON_SEARCH(@j, 'all', '10', NULL, '$[1][0]')|+-----------------------------------------------+|"$[1][0].k"|+-----------------------------------------------+mysql>SELECTJSON_SEARCH(@j,'all','abc',NULL,'$[2]');+---------------------------------------------+|JSON_SEARCH(@j, 'all', 'abc', NULL, '$[2]')|+---------------------------------------------+|"$[2].x"|+---------------------------------------------+mysql>SELECTJSON_SEARCH(@j,'all','%a%');+-------------------------------+|JSON_SEARCH(@j, 'all', '%a%')|+-------------------------------+|["$[0]", "$[2].x"]|+-------------------------------+mysql>SELECTJSON_SEARCH(@j,'all','%b%');+-------------------------------+|JSON_SEARCH(@j, 'all', '%b%')|+-------------------------------+|["$[0]", "$[2].x", "$[3].y"]|+-------------------------------+mysql>SELECTJSON_SEARCH(@j,'all','%b%',NULL,'$[0]');+---------------------------------------------+|JSON_SEARCH(@j, 'all', '%b%', NULL, '$[0]')|+---------------------------------------------+|"$[0]"|+---------------------------------------------+mysql>SELECTJSON_SEARCH(@j,'all','%b%',NULL,'$[2]');+---------------------------------------------+|JSON_SEARCH(@j, 'all', '%b%', NULL, '$[2]')|+---------------------------------------------+|"$[2].x"|+---------------------------------------------+mysql>SELECTJSON_SEARCH(@j,'all','%b%',NULL,'$[1]');+---------------------------------------------+|JSON_SEARCH(@j, 'all', '%b%', NULL, '$[1]')|+---------------------------------------------+|NULL|+---------------------------------------------+mysql>SELECTJSON_SEARCH(@j,'all','%b%','','$[1]');+-------------------------------------------+|JSON_SEARCH(@j, 'all', '%b%', '', '$[1]')|+-------------------------------------------+|NULL|+-------------------------------------------+mysql>SELECTJSON_SEARCH(@j,'all','%b%','','$[3]');+-------------------------------------------+|JSON_SEARCH(@j, 'all', '%b%', '', '$[3]')|+-------------------------------------------+|"$[3].y"|+-------------------------------------------+

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容