mysql獲取兩個表中不重複的資料

2021-09-27 13:12:00 字數 2996 閱讀 3097

比如有兩個資料表,表結構是一樣的,乙個a表資料300w行,乙個b表資料17w行,我們需要獲取a表中不包含b表的資料。下面大致記錄一下獲取過程,方便查詢回憶。

a表結構:

idpay_id

user_id

b表結構和a表一直,只不過b表中的user_id欄位都是唯一的,而a表中的user_id欄位是可重複的。

我們都知道mysql提供了關鍵字distinct來排除重複資料,

select count(distinct user_id) from  a  where 1   ;

+-----------------------------+

| count(distinct user_id) |

+-----------------------------+

| 240522 |

+-----------------------------+

mysql> select count(1) from b;

+----------+

| count(1) |

+----------+

| 176731 |

我們看到a表和b表是有一定的差值的,接下來是獲取差值對應的字段。

select distinct user_id from a left join b  on a.user_id= b.user_id where f.user_id is null ';

+-------------+

| user_id |

+-------------+

| 10000058 |

| 10009228 |

| 10042967 |

....

+-------------+

通過查詢結果,我們獲取到了不重複的user_id的值,但是需求是獲取不重複的行資料,所以還要獲得a表中pay_id的值。只是在通過distinct獲取其他資料的時候,遇到了一些 問題

(1)不能是分散的寫法

如:distinct user_id,distinct user_id這種寫法會報錯

(2)正確的distinct寫法

distinct  user_id, pay_id
select distinct p.user_id,p.pay_id from a as p  left join b as f on p.user_id = f.user_id 

where f.user_id is null order by p.user_id asc limit 10;

類似於:

| user_id | pay_id |

+-------------+--------+

| 10000058 | 16 |

| 10000058 | 17 |

| 10000058 | 18 |

| 10000058 | 19 |

| 10000058 | 20 |

有個問題,distinct多個字段,那麼只會排除user_idpay_id都相同的資料,並不符合需求,需求是只排除user_id重複的部分,然後獲取唯一user_id以及對應的pay_id

(3)符合需求的寫法(使用left join)

select  a.pay_id,a.user_id  from   a left join b  as f on a.user_id = f.user_id 

where f.user_id is null group by a.user_id order by a.user_id desc limit 10;

+----------+-------------+

| pay_id | |user_id |

+----------+-------------+

| 16 | 10000058 |

| 15 | 10009228 |

| 77 | 10042967 |

| 687 | 10043113 |

| 119 | 10043147 |

我們這裡沒有使用distinct關鍵字,首先是使用left join去除兩個表中重複的部分,其次是使用group by的去重特性,當按照user_id分組的時候,自然在結果中user_id也是唯一的乙個。

記錄這一篇的原因是因為一開始想的太複雜了,什麼子查詢啊,not exist之類的,自己把問題想麻煩了,包括使用distinct獲取資料,往錯的方向上努力,無論如何都是錯的。偏偏忘記了最常用的left joingroup by,明明就是一條sql就能解決的事情。

祝祖國70周年生日快樂,也祝各位國慶節快樂!

end

mysql 獲取mysql中不重複的資料

假設情景如下 user table的字段如下 keyword t c time t heat keyword是字串的具有重複性的,c time表示的是時間,heat是整形常數。如下所示 如下 select keyword,max created at as latest created at max...

劍指offer 陣列中找兩個不重複數字

問題描述 陣列中除了兩個數之外,其他數都出現兩次,找出陣列中兩個只出現一次的數字。解題思路 首先可以思考這樣的情況,兩個相同的數字進行異或,異或的結果等於0。所以我們可以以此作為解題的突破口。如果只有乙個數字的話,那麼我們讓所有的數字分別進行異或,最終得到的結果就是這個只出現一次的數,然後定義乙個指...

DedeCMS中MySQL修復表的兩個小技巧

dedecms使用者經常碰到資料表出現報錯 dede search keywords is marked as crashed and should be repaired 這個說明你的資料表可能是崩潰了,需要修復,對此我們有以下機種方法 如果資料量不大,可以直接在dedecms後台使用資料表修復的...