解析mysql中:單表distinct、多表group by查詢去除反復記載。本站提示廣大學習愛好者:(解析mysql中:單表distinct、多表group by查詢去除反復記載)文章只能為提供參考,不一定能成為您想要的結果。以下是解析mysql中:單表distinct、多表group by查詢去除反復記載正文
單表的獨一查詢用:distinct
多表的獨一查詢用:group by
distinct 查詢多表時,left join 還有用,全銜接有效,
在應用mysql時,有時須要查詢出某個字段不反復的記載,固然mysql供給有distinct這個症結字來過濾失落過剩的反復記載只保存一條,但常常只用它來前往不反復記載的條數,而不是用它來前往不反復記載的一切值。其緣由是distinct只能前往它的目的字段,而沒法前往其它字段,用distinct不克不及處理的話,我只要用二重輪回查詢來處理,而如許關於一個數據量異常年夜的站來講,無疑是會直接影響到效力的。
上面先來看看例子:
表的構造以下:
id name
1 a
2 b
3 c
4 c
5 b
根本的表的構造年夜概如許,這只是一個簡略的例子,現實的多表查詢等等情形會龐雜很多。
好比我想用一條語句查詢獲得name不反復的一切數據,那就必需應用distinct去失落過剩的反復記載。
select distinct name from table
獲得的成果是:
name
a
c
似乎到達後果了,可是,我想要獲得的是id值呢?改一下查詢語句吧:
select distinct name, id from table
成果會是:
id name
1 a
2 b
3 c
4 c
5 b
distinct怎樣沒起感化?感化實際上是起了,不外他同時感化了兩個字段,也就是必需得id與name都雷同的才會被消除。
我們再改改查詢語句:
select id, distinct name from table
很遺憾,除毛病信息你甚麼也得不到,distinct必需放在開首。難到不克不及把distinct放到where前提裡?嘗嘗,照樣報錯。
試了半天其他能想到的辦法也不可,最初在mysql手冊裡找到一個用法,用group_concat(distinct name)合營group by name完成了我所須要的功效,高興,天助我也,趕緊嘗嘗。
報錯,愁悶!
連mysql手冊也跟我過不去,先給了我願望,然後又把我推向掉望。
再細心一查,group_concat函數是4.1支撐,暈,我4.0的。沒方法,進級,升完級一試,勝利。
終究弄定了,不外如許一來,又必需請求客戶也進級了。
忽然靈機一閃,既然可使用group_concat函數,那其它函數能行嗎?
趕忙用count函數一試,勝利,費了這麼多功夫,本來就這麼簡略。
如今將完全語句放出:
select *, count(distinct name) from table group by name
成果:
id name count(distinct name)
1 a 1
2 b 1
3 c 1
最初一項是過剩的,不消管就好了,目標到達。
本來mysql這麼笨,悄悄一下就把他騙曩昔了,如今拿出來願望年夜家不要被這成績折騰。
再趁便說一句,group by 必需放在 order by 和 limit之前,否則會報錯。
說一下group by的現實例子:
$sql = 'select DISTINCT n.nid,tn.tid,n.title,n.created,ni.thumbpath from {term_node} tn INNER JOIN {node} n ON n.nid=tn.nid INNER JOIN {node_images} ni ON ni.nid=n.nid where tn.tid IN('.implode(',', $tids).') ORDER BY n.nid DESC';
$res = db_query($sql);
$t_data = array();
while($r = db_fetch_array($res)) {
print_r($r);
}
用這個查詢語句的時刻,總會湧現兩個雷同nid的情形,好比上面的成果
Array
(
[created] => 1215331278
[nid] => 1603
[tid] => 32
[title] => 夏季婚禮綠色沁飲DIY
[thumbpath] => files/node_images/home-77.1_tn.jpg
)
Array
(
[created] => 1215331278
[nid] => 1603
[tid] => 32
[title] => 夏季婚禮綠色沁飲DIY
[thumbpath] => files/node_images/003_primary_tn.jpg
)
下面用了DISTINCT也不論用,實際上是管用了,然則我想查詢構造裡nid是獨一的。
最初用了group by
$sql = 'select
n.nid,tn.tid,n.title,n.created,ni.thumbpath from {term_node} tn INNER
JOIN {node} n ON n.nid=tn.nid INNER JOIN {node_images} ni ON
ni.nid=n.nid where tn.tid IN('.implode(',', $tids).') GROUP BY
n.nid DESC';
$res = db_query($sql);
$t_data = array();
while($r = db_fetch_array($res)) {
print_r($r);
}
我就獲得了nid是獨一的。