原因是distinct只能返回其目标字段,不能返回其他字段。这个问题困扰了我很久。如果distinct解决不了,我只能用双循环查询来解决,这无疑会直接影响一个数据量大的站的效率。所以我花了很多时间研究这个问题,在网上也找不到解决的办法。期间,我拉着荣蓉帮忙。结果我俩都抑郁了。让我们先来看看这个例子:
桌子
id名称
1 a
2 b
3°c
4°c
5 b
图书馆结构是这样的。这只是一个简单的例子,实际情况会复杂得多。
例如,如果我想用一条语句查询所有名称不重复的数据,我必须使用distinct来删除冗余的重复记录。
一个
从表中选择不同的名称
结果是:
名字
a
b
c
看似达到了效果,但我要的是id值?更改查询语句:
从表中选择不同的名称、id
结果将是:
id名称
1 a
2 b
3°c
4°c
5 b
为什么截然不同的方法不起作用?它工作,但同时在两个字段上工作,也就是说,相同id和名称的字段将被排除。。。。。。。
让我们再次更改查询语句:
从表中选择id、不同的名称
不幸的是,除了错误信息,你什么也没有得到。distinct必须放在开头。在哪里的条件下很难区分?是的,还是报错。。。。。。。
麻烦吗?的确,每一次努力都没能解决这个问题。没办法。继续问人。
我在公司抓了一个JAVA程序员。他向我展示了distinct在oracle中的使用,但我在mysql中找不到解决方案。最后,下班前,他建议我分组试试。
我试了很久,还是不行。最后在mysql手册里找到了一个用法,用group_concat和group by name实现了我需要的功能。我很兴奋。上帝保佑我。赶紧试试。
报告错误。。。。。。。。。。。。郁闷。。。。。。。就连mysql手册都和我过不去,先是给了我希望,然后又把我推向失望,这是残酷的。。。。
再仔细检查一下,group_concat函数是4.1支持的,我的函数是4.0。没办法。升级。升级后,尝试成功。。。。。。
最后做到了,但是这样就必须要求客户升级。
突然灵机一动。既然可以使用group_concat函数,那么其他函数能工作吗?
快试试计数功能,成功了,我。。。。。。我想哭。花了这么多时间。。。。。。。。原来是这么简单。。。。。。
现在发布完整的声明:
按名称从表组中选择*,计数
结果:
id名称计数
1 a 1
2 b 1
3 c 1