网站/小程序/APP个性化定制开发,二开,改版等服务,加扣:8582-36016

    本文主要介绍了mysql查询结果实现多列拼接查询,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    之前遇到过一个问题,mysql数据库中有两个表,一张地址表存放省市区等位置信息,另一张用户表里存在三个字段分别对应地址表中的三个位置信息(很奇怪的表格式),如图:

    现在需要查询user表中的数据,并根据user表中省市区的值,在地址表中查询到对应的位置信息(name)并显示出来;

    本人对sql并不精通,所以捋了一个大致逻辑

    首先要得到user表的省市区三个字段的值,我们一般的查询方式是

    SELECT province,city,district FROM `user` WHERE id =1;


    这个比较简单,得到的结果为一行三列的值,如图: 

    这是正常的写法,之后使用这个结果为查询条件,去查询地址表中的name即可.

    当然想法似乎不错,但这个查询出来的结果是分为三段的,并不利于我们后面的查询,总不能取出结果后再进行处理再查询吧,这样太麻烦了,这时候要用到sql的两个函数,CONCAT_WS和CONCAT,两个函数的作用是将结果拼接为一个字符串,具体的用法可以自行百度.这里就不多做介绍了:)

    所以我们的查询语句就可以写成SELECT CONCAT_WS(',',province,city,district) AS ids FROM `user` WHERE id =1;得到的结果如图:

    有了这个结果我们基本上可以去查询到地址信息了,同样的在查询地址信息的时候我们也做了相应的拼接,所以最终的sql是这样的

    SELECT GROUP_CONCAT(`name`) FROM address WHERE id IN (SELECT CONCAT_WS(',',province,city,district) FROM `user` WHERE id =1);


    理想中的结果如图: 

    但实际上,这个语句并不能得到我们想要的结果,原因是SELECT CONCAT_WS(',',province,city,district) FROM `user` WHERE id =1查询出的结果是一个字符串,而字符串却不能作为查询条件中In的条件来使用,所以查询的结果并不是我们想要的.

    再分析下我们的思路并没有问题,那么怎么才能用这个字符串作为查询条件,并最终得出我们想要的结果呢?根据网上的资料得知,查询条件in的内容只能是数字型的,所以他并不支持字符串的查询,所以这里我们还需要一个函数,instr.说实话这也是我第一次知道这个函数,毕竟对mysql真的只是会一点增删改查的皮毛,哈哈.那么接下来我们来试试这个函数的效果,最终的sql为

    SELECT
      GROUP_CONCAT(`name`)
    FROM
     address
    WHERE INSTR(
        (SELECT
          CONCAT_WS(',', province, city, district)
        FROM
          `user`
        WHERE id = 1),
        id
      ) ;


    执行后的结果也是我们想要的.当然上边的语句只是实现了查找到地址的结果,具体的可以根据业务需求继续修改,mysql的函数不得不说确实很强大.今后还是要多学习才是; 

    另:instr函数的使用有很大的局限性,详情可参考:https://www.jb51.net/article/243316.htm

    所以,最终的sql为:

    SELECT
      GROUP_CONCAT(`name`)
    FROM
      address
    WHERE INSTR(
        CONCAT(
          ',',
          (SELECT
            CONCAT_WS(',', province, city, district)
          FROM
            `user`
          WHERE id = 1),
          ','
        ),
        CONCAT(',', id, ',')
      ) ;


     


    评论 0

    暂无评论
    0
    0
    0
    立即
    投稿
    发表
    评论
    返回
    顶部