引言
最近涉及到三张表联查,中间还涉及到对数据的处理,看张图,足以说明逻辑之复杂。
逻辑梳理
简单的介绍一下,我需要的查询结果:
从车主信息表里获取车主的登录信息,OK,之后的事情与车主信息表无关了。
然后,我需要从车主故事表里,获取车主故事的ID,根据这个ID去查询车主故事图片信息表里的图片,但是一个
车主故事可能对应多个相关图片,所以需要将获取的n张图片,放在一个字段里,查询出来,也就是
“pic1,pic2,pic3……picn” 这样的形式。下边看看在该需求下,sql的进化过程:
级联查询三张表
级联查询三张表,并不难,sql语句如下:
SELECT
mos.*,
m.LOGIN_NAME,
mosp.PIC_URL,
mosp.SUFFIX
FROM
member_owner_story mos
LEFT JOIN member_owner_story_pic mosp ON mos.MEMBER_OWNER_STORY_ID = mosp.MEMBER_OWNER_STORY_ID
LEFT JOIN member m ON mos.MEMBER_ID = m.MEMBER_ID
WHERE
mos.IS_DELETE = 'N'
但是这并没有得到我想要查询的结果,只是将图片路径和后缀名查出来了而已,于是有了下一个sql语句:
Concat使用
先看代码:
SELECT
mos.*,
m.LOGIN_NAME,
tmp.num AS EVALUATE_NUM,
CONCAT(mosp.PIC_URL, mosp.SUFFIX) PIC_URL
FROM
member_owner_story mos
LEFT JOIN member_owner_story_pic mosp ON mos.MEMBER_OWNER_STORY_ID = mosp.MEMBER_OWNER_STORY_ID
LEFT JOIN member m ON mos.MEMBER_ID = m.MEMBER_ID
LEFT JOIN (
SELECT
member_owner_story_id,
count(member_owner_story_id) num
FROM
MEMBER_OWNER_STORY_EVALUATE mose
GROUP BY member_owner_story_id
) tmp ON tmp.member_owner_story_id = mos.MEMBER_OWNER_STORY_ID
WHERE
mos.IS_DELETE = 'N'
效果如下:
可以看到图片路径和后缀名组合到一起了,但是,我的需求是相同的ID的图片信息组合到一个字段里,所以还得
改!
GROUP_CONCAT的使用
sql语句:
SELECT
mos.*, m.LOGIN_NAME,
mose.num AS EVALUATE_NUM,
mosp.pic_url AS PIC_URL,
m.head
FROM
member_owner_story mos
LEFT JOIN (
SELECT
member_owner_story_id,
GROUP_CONCAT(
CONCAT(tmp.PIC_URL, tmp.SUFFIX)
) pic_url
FROM
member_owner_story_pic tmp
GROUP BY
member_owner_story_id
) mosp ON mosp.member_owner_story_id = mos.MEMBER_OWNER_STORY_ID
LEFT JOIN (
SELECT
CONCAT(m.MEMBER_LOGO,m.suffix) head,
m.LOGIN_NAME LOGIN_NAME,
m.MEMBER_ID MEMBER_ID
FROM
member m
)m ON mos.MEMBER_ID = m.MEMBER_ID
LEFT JOIN (
SELECT
member_owner_story_id,
count(member_owner_story_id) num
FROM
MEMBER_OWNER_STORY_EVALUATE
GROUP BY
member_owner_story_id
) mose ON mose.member_owner_story_id = mos.MEMBER_OWNER_STORY_ID
WHERE
mos.IS_DELETE = 'N'
效果:
可以看到我想要的效果出来了,所有的URL地址通过“,”组合到一起了,那么前台在处理的时候,直接通过split
将URL拆开就OK了。
总结
要学习的东西太多,强大的sql语句,语法结构还有业务流程,这些这些统统都仍然需要学习。