hql:
String hql = "select new map(ct.curriculum.alias as curriculum_alias,ct.curriculum.name as curriculum_name) " + "from CurriculumTag ct where ct.id in (select min (ct.id) from CurriculumTag group by ct.curriculum.alias)";
该hql的语句的作用说起来比较饶,组织了好几次都感觉说不清楚,就这样吧。。。
修正:后来我试了一下上面的hql语句,查询结果不是我想要的。后来改为下面的hql语句才正确。其实下面这条hql就给嵌套查询的类加了一个别名
String hql = "select new map(ct.curriculum.alias as curriculum_alias,ct.curriculum.name as curriculum_name) " + "from CurriculumTag ct where ct.id in (select min (ct.id) from CurriculumTag ct group by ct.curriculum.alias)";
2014-04-16修改:
String hql = "select new map(ct.curriculum.alias as curriculum_alias,ct.curriculum.name as curriculum_name) " + "from CurriculumTag ct where ct.id in (select min(ct2.id) from CurriculumTag ct2 group by ct2.curriculum.alias)";
今天突然发现修改后的hql还是没得到我要的数据,又把嵌套查询的类的别名改为ct2,才正确工作了。原因是父查询的类的别名和子查询的类的别名不能一样,一个ct,一个ct2。。
注:distinct作用于一列和最用于多列的不同效果
表结构:
CREATE TABLE `tb_curriculum_tag` ( `id` bigint(20) NOT NULL auto_increment, `curriculum_alias` varchar(255) NOT NULL, `tag_alias` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
表数据:
id | curriculum_alias | tag_alias |
1 | 5F9FAGvQi6BJJBd | 665477 |
2 | 5F9FAGvQi6BJJBd | 294005 |
3 | 5F9FAGvQi6BJJBd | 828230 |
4 | 5F9FAGvQi6BJJBd | 356791 |
查询一:distinct作用于一列
mysql> select distinct curriculum_alias from tb_curriculum_tag -> ; +------------------+ | curriculum_alias | +------------------+ | 5F9FAGvQi6BJJBd | +------------------+ 1 row in set
查询二:distinct作用于多列
mysql> select distinct curriculum_alias,tag_alias from tb_curriculum_tag; +------------------+-----------+ | curriculum_alias | tag_alias | +------------------+-----------+ | 5F9FAGvQi6BJJBd | 665477 | | 5F9FAGvQi6BJJBd | 294005 | | 5F9FAGvQi6BJJBd | 828230 | | 5F9FAGvQi6BJJBd | 356791 | +------------------+-----------+ 4 rows in set
这就是不同的效果,查询二是把两个字段作为整体distinct,我的理解。。
查询三:count和distinct结合使用统计不重复列的个数
mysql> select count(distinct curriculum_alias) from tb_curriculum_tag; +----------------------------------+ | count(distinct curriculum_alias) | +----------------------------------+ | 1 | +----------------------------------+ 1 row in set
查询四:使用group by统计不重复列的个数
mysql> select count(*) from tb_curriculum_tag ct where ct.id in (select min(ct.id)from tb_curriculum_tag ct group by ct.curriculum_alias); +----------+ | count(*) | +----------+ | 1 | +----------+ 1 row in set
查询四使用group by也实现了查询三的效果。
查询五:使用group by的效果
mysql> select * from tb_curriculum_tag group by curriculum_alias -> ; +----+------------------+-----------+ | id | curriculum_alias | tag_alias | +----+------------------+-----------+ | 1 | 5F9FAGvQi6BJJBd | 665477 | +----+------------------+-----------+ 1 row in set
这里加上group by就查询出一条数据,和我原来想的不一样。group by主要结合一些统计函数来进行统计操作。
查询五:count和group by统计
mysql> select count(*) from tb_curriculum_tag ct where ct.id in (select ct.id from tb_curriculum_tag ct group by ct.curriculum_alias); +----------+ | count(*) | +----------+ | 1 | +----------+ 1 row in set
CurriculumTag类设计:
@Entity @Table(name = "tb_curriculum_tag") public class CurriculumTag implements Serializable { private Long id; private Curriculum curriculum; private Tag tag; ////////////////setter and getter//////////////////// @Id @GeneratedValue(strategy = GenerationType.IDENTITY) public Long getId() { return id; } public void setId(Long id) { this.id = id; } /** * The name of the column referenced by this foreign * key column. * * @return */ @ManyToOne(targetEntity = Curriculum.class) @JoinColumn(name = "curriculum_alias", nullable = false, referencedColumnName = "alias") public Curriculum getCurriculum() { return curriculum; } public void setCurriculum(Curriculum curriculum) { this.curriculum = curriculum; } @ManyToOne(targetEntity = Tag.class) @JoinColumn(name = "tag_alias", nullable = false,referencedColumnName = "alias") public Tag getTag() { return tag; } public void setTag(Tag tag) { this.tag = tag; } }