iT邦幫忙

0

SQL如何只取出表A的資料,但是是用表B的資料作為條件

假設有兩個表:
表A(mail會員)
表B(寄送狀態)
為一對多的關係,
想取出所有有成功寄送過的會員的話,sql要怎麼寫呢?

表A(mail會員)

id user_id
1 1
2 2
3 3
4 4

表B(寄送狀態)

id user_id send_at status
1 1 20190701 done
2 2 20190701
3 1 20190702 done
4 3 20190702 done
5 3 20190703
6 4 20190703
7 1 20190704 done

想取得的結果

id user_id
1 1
3 3
SELECT a.id, a.user_id
FROM a JOIN b ON a.user_id=b.user_id and b.status='done'
GROUP BY a.id

用這個sql的話是可以取出想要的結果,但覺得應該有比group by更好的方法。

石頭 iT邦高手 1 級 ‧ 2019-07-27 10:33:15 檢舉
我看到了 沒事^^
柯柯 iT邦新手 5 級 ‧ 2019-07-28 11:40:11 檢舉
select * from A where id=(select user_id from B where status='done') 這樣?
5
石頭
iT邦高手 1 級 ‧ 2019-07-27 10:35:47

如果妳的Table A user_id 資料不重複可以使用exists

Query 1:

SELECT a.id, a.user_id
FROM a 
WHERE exists(
	select 1
	from b
	where a.user_id = b.user_id and b.status='done'
)

Results:

| id | user_id |
|----|---------|
|  1 |       1 |
|  3 |       3 |
Sponge iT邦新手 5 級 ‧ 2019-07-28 13:54:58 檢舉

這方法再配上正確的索引,應該就是效能最佳解了
主要的成本會花費在兩張資料表的個別查詢,少部分成本花在巢狀迴圈
給個讚!

1

http://sqlfiddle.com/#!9/e1233e/15

提供你另一個思路, 用subquery

2
小魚
iT邦大師 1 級 ‧ 2019-07-27 11:53:48
SELECT id, user_id 
FROM `mail` 
WHERE user_id IN (SELECT user_id FROM `status` WHERE `status` = 'done');

https://ithelp.ithome.com.tw/upload/images/20190727/20105694kCoSJFUXvF.png

小魚 iT邦大師 1 級 ‧ 2019-07-27 11:55:31 檢舉

我是沒比較過,
感覺起來效率應該不會差太多吧,
不過至少也要有個幾百萬筆資料下去比較會比較有感覺...

maxmas iT邦新手 4 級 ‧ 2019-07-29 10:09:52 檢舉

IN 裡面是陣列,表示在這個陣列裡,如果資料少是沒差,但若以電子報這種資料表來說,寄出可能都上千封以上,那麼這個已完成的陣列會很大,會吃到主機的記憶體,所以不建議

1
I code so I am
iT邦高手 1 級 ‧ 2019-07-28 07:03:15

使用 distinct 吧。

SELECT distinct a.user_id
FROM a JOIN b ON a.user_id=b.user_id and b.status='done'
0
japhenchen
iT邦大師 1 級 ‧ 2019-07-29 07:34:24
SELECT A.* FROM B
LEFT JOIN A ON A.ID = B.ID 
WHERE B.DATE >= '2019/04/01'

我要發表回答

立即登入回答