美文网首页
SQL IN 里面放GROUP_CONCAT子查询

SQL IN 里面放GROUP_CONCAT子查询

作者: 小学生课代表 | 来源:发表于2020-12-23 14:04 被阅读0次

查询需求:用户可以邀请其他人,而用户又可以被其他人邀请,查询出所有跟邀请人有关的邀请人id->结果作为条件
查询过程:根据inviter_id(邀请人)查询visitor_id(被邀请人)中有inviter_id的所有inviter_id 再加上自身的inviter_id

image.png
  1. 首先想到了用一个in语句,in里面放一个子查询,子查询后面拼上自己的id

     WHERE ui.user_id IN (
       (SELECT GROUP_CONCAT(inviter_id) 
       FROM rv_user_invite WHERE visitor_id = 1340843848854667264),1340843848854667264
     )
    

    一开始也没有报错,所以看来是没有问题的,后来经过测试发现查询的结果跟数据库里的结果不匹配,最后的结果少了一个子查询的第二个id
    比如,in里面的结果是1339127322933985280,1337341587499253760, 1340843848854667264。最后把1337341587499253760丢掉了。
    具体原因不知道,猜测是无论子查询有多少结果,生效的只是第一个逗号前的值

  2. 查找其他替代in的方法:FIND_IN_SET

    FIND_IN_SET(
    ui.user_id,(
    (SELECT GROUP_CONCAT(inviter_id)
     FROM rv_user_invite WHERE visitor_id = 1340843848854667264),
    1340843848854667264)) 
    

此时会报错1241 - Operand should contain 1 column(s), Time: 0.012000s
FIND_IN_SET的第二个参数应该放置由concat拼接出来的,直接一个括号中间放逗号肯定会有问题,继续优化

  1. 使用sql里的拼接函数CONCAT
FIND_IN_SET(
ui.user_id,(
SELECT CONCAT(GROUP_CONCAT(inviter_id) ,',', 1340843848854667264)
FROM rv_user_invite 
WHERE visitor_id = 1340843848854667264))

这样就可以了,但是此时又忽略了一个重要条件
CONCAT函数拼接过程中只要有一个为null,其结果就为null
测试中可以把参数换成1337341587499253760,这个id在visitor_id列中没有,在inviter_id有。最后什么都查不出来

  1. 最后完善结果,使用判断函数IFNULL或者IF都可以
    此时已经确定了,只要子查询结果正确,结果就正确
SELECT CONCAT(
IFNULL(GROUP_CONCAT(inviter_id),'-1'),',', 1337341587499253760)
 FROM rv_user_invite WHERE visitor_id = 1337341587499253760)

相关文章

  • SQL IN 里面放GROUP_CONCAT子查询

    查询需求:用户可以邀请其他人,而用户又可以被其他人邀请,查询出所有跟邀请人有关的邀请人id->结果作为条件查询过程...

  • mysql操作

    sql一些函数,复杂查询等基本操作 sql脚本 函数GROUP_CONCAT -GROUP_CONCAT 这个函数...

  • 数据分析之SQL子查询

    文章阅读路线: SQL子查询概念 独立子查询实例 相关子查询实例 SQL子查询常见玩伴 1.SQL子查询概念 子查...

  • MySQL 函数 | group_concat

    group_concat | 作用 列转行; 示例表 示例 SQL select group_concat(rol...

  • 《SQL必知必会》笔记6-子查询、联结表join

    1 使用子查询 查询(query):任何SQL语句都是查询,但一般指SELECT语句。 SQL还允许创建子查询(s...

  • SQL注入

    可能引发注入的场景 SQL里面直接拼接了SQL 查询参数里面直接拼接SQL,没有做处理(直接把查询关键字拼到SQL...

  • SQL关联子查询

    简单易懂教你学会SQL关联子查询 初学SQL的人都会觉得SQL的关联子查询难以理解,为什么?这是有原因的。 关联子...

  • JPA 动态生成sql

    1. 构建格式化时间查询sql: 生成sql: 2. 构建多条件查询sql: 生成sql: 3. 构建子查询: 生...

  • 子查询和组合查询

    子查询 SELECT 语句是 SQL 的查询。 假如要从多个表中过滤数据,SQL 还允许创建子查询(subquer...

  • Oracel_子查询

    SQL子查询 子查询语法 子查询 (内查询) 在主查询之前一次执行完成。 子查询的结果被主查询(外查询)使用 。 ...

网友评论

      本文标题:SQL IN 里面放GROUP_CONCAT子查询

      本文链接:https://www.haomeiwen.com/subject/iulynktx.html