有这个么需求,一些练习会有人评论,在列出练习时要将有评论的练习排在前面,这时候可以使用left join与多个order by的办法来达到要求。

首先,有practice_id为3539、3715、3514三个练习是有人评论的,3514评论时间为最新:

SELECT
	* 
FROM
	comments 
WHERE
	practice_id IN ( 3514, 3715, 3527, 3539 )

使用left join

SELECT
	`practices`.* 
FROM
	`practices`
	left JOIN `comments` ON `comments`.`practice_id` = `practices`.`id` 
WHERE
	`practices`.`user_id` = 7 
	AND `practices`.`pth_sentence_id` = 755 
	AND `practices`.`del` = FALSE 

解读下:

  • WHERE条件:
    找到user_id为7的用户,而且其练习的句子id为755,并且del为false(使用了软删除的办法,只标记,并不真的删除)

  • FROM中,practices是练习表,使用左连接,这样可以显示满足条件的所有练习记录(不管有没有评论)。

left join与inner join的区别


如果你使用inner join,只能得到完全满足inner join中条件的记录,共三条,与第一张图对应上了

详细区别请搜索

https://cn.bing.com/search?q=left+join+inner+join+%E5%8C%BA%E5%88%AB

多个order by

因为有评论的要在前,所以comment.created_at要写在前面,表示这个是主排序,

ORDER BY
	comments.created_at DESC,
	practices.created_at desc

如果practices.created_at在前面,

ORDER BY
	practices.created_at desc,
	comments.created_at DESC
	

结果会是这样:

我是@爱玩的安哥,关注我获取更多有用知识

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐