比如有兩個資料表,表結構是一樣的,乙個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_id
和pay_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 join
和group 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後台使用資料表修復的...