mysql使用left join进行联合多表查询(处理多表查询时,某表数据为空值的处理以及将结果集中多条数据一行显示的处理)
文章是按照需求分析和陷阱序列场景再现的顺序来写的。
如果你不是新手,可以直接跳到最后看代码来大概了解一下。
一共有三张表,分别是
买家表,记录用户信息
该表记录了用户拥有哪些标签以及分配标签的人。 它是用户和标签之间的关系表。 它通常不用于记录需要显示到UI的数据。
该表可以直接理解为标签表,其中包含了每个标签的信息。 由于这个标签是为买家创建的,所以名称比较长。 本例中可以直接理解为tag
在实际应用中,我们经常需要用一句话来查询我们需要的简单信息。
所以我们需要联合查询
其中,联合查询可以直接使用多表,也可以使用左连接。
我们通过实际操作来看看具体的函数需要哪些语法。
第一个要求是这样的:
找到以下显示效果的信息:
需要查询的字段有
买家id、买家昵称、标签名(注意这只是一张关系表,查询时需要用到这张表,但其字段不显示)
而且,当买家有多个标签时,我们用“标签1,标签2,标签3”来使用一行数据,标签字段使用逗号分隔显示。
那么,我们想到的就是使用多表联合基础查询
看看这个5908买家的所有标签
但如果我们想要家庭成员,就需要用到微信普通客户等一行数据。
这就是它的工作原理
但是这样有一个问题,就是如果使用where=条件时返回了一条数据,那么使用时也会合并为一行,如下:
可以看到,这显然不是我们想要的结果,因为我们需要分别显示这三个买家的信息及其标签。 然后我们需要添加一个group by,否则默认是一行表达所有结果
好吧,看来没有什么问题了。 但注意到这里没有5910的信息吗? 为什么? 因为在where条件中,这种联表查询时,当其中一个条件不满足时,就不会返回结果。
该语句中,在检索买家标签关系表时,没有5910的标签关联信息,因此匹配为空,不返回该结果。
后来摸索,在where条件中使用,在子集中使用if,等等很多方法(因为我也是中途出家的)最后都失败了。
然后我又拿起书,在上查资料,想到了left join。
这种左连接的特点是,查询时,如果前一个表有数据,则返回前一个查询表中的数据。 如果后续表不匹配,则为空。 这似乎就是我们想要的结果。
所以使用左连接代替
这里要注意.tagid的关系。 例如,结果的第一行,只有一个id,name为2。显然,id是错误的,因为它没有用。
更改:
这是正确的。
由于我们不需要使用tagid字段,所以我们可以将其删除,并且不会影响结果。 只要正确表达关系陈述中的关系即可。
最后,我们在where条件中添加我们要搜索的买家的ID集合。
结果是正确的。
但在实际使用中,我们可能还需要使用关联的拼音检索表,基于电话查询等场景,所以我们还需要更改where Buyer。 进入我们自己的查询语句中,例如
或者添加根据电话号码的查询(如果应用中没有判断给定内容是字符串还是数字,直接添加条件即可,不会对性能影响太大)
如果要分开搜索数字和字母,可以在查询数据库之前使用应用程序确定查询条件。 比如判断是数值检索,则对该字段进行查询。
这使得查询变得简单。
如果这两个查询返回的结果放在where in语句中,就相当于1,2,3,4,5这样的数据
所以添加拼音和电话搜索的句子是这样的
圈出的位置代替了之前的5908,5909,5910
查询示例:
扫一扫在手机端查看
-
Tags : mysql left join concat
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。