SQL语句去重

        在实现获取所有题目列表API中,有这样一个场景。

        我们现在有两张表,一张表用于存放所有题目的数据,另一张表用于存放题目和章节归属关系的数据——因为一道题目可以属于多个章节,将题目章节关联表独立出来,会使结构更清晰,可读性更高。

        在查询试题列表的时候,我们要返回试题的所有信息,包括试题对应的章节ID,那么就会涉及到两表联查。

SELECT eqt.*,
       eqc.chapter_id
FROM em_question_test eqt
LEFT JOIN em_question_chapter eqc ON (eqt.id = eqc.question_id)
WHERE del_flag = ${@com.cothink.constant.DbConstant@DEL_FLAG_0}
AND version_flag = ${@com.cothink.constant.DbConstant@NER_VERSION_FLAG_0}

        但是搜索出来的结果呈现出一个错误,题目对应多少个章节,他就会被查询出多少次——也就是说同一道题,因为关联了多个章节,在查询时成为了多条数据。这个问题应该如何解决呢?

        实际上只需要运用GROUP BY语句就可以实现。

        对于这个方法的官方解释是:GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。其实也就是根据这一列,将重复的数据合成一个集合。在这里我们只需要给最后一行加一句:

GROUP BY eqt.id

        将ID相等的所有列合并成一条数据,并返回第一条。也就将无数条ID相同(也就是同一个题目)、但章节ID不同的题目,合并成了第一条,只返回这条数据。

        另外一种就是用DISTINCT关键字,用于返回唯一不同的值,将其他所有重复的值去除。

select distinct log_content
from sys_log

你可能感兴趣的:(sql,java)