iT邦幫忙

1

SQL 兩個資料表 交叉比對 問題

很抱歉打得這麼籠統 上圖看看
表A與表B 做比對 例:user_a看商品項目的時候他會顯示他購物的東西這樣
可以給個範例 讓我參考嗎 感恩
https://ithelp.ithome.com.tw/upload/images/20200408/20109685yzwlyw34kK.png

看更多先前的討論...收起先前的討論...
slime iT邦大師 1 級 ‧ 2020-04-08 15:16:50 檢舉
疑問:
User_A 是購物紀錄的 u1 嗎?
如果是, 那 User_B 沒有購物紀錄, 為什麼會挑出"鉛筆"?
我打錯== 已改
jasonb122 iT邦新手 5 級 ‧ 2020-04-08 19:00:38 檢舉
用LEFT JOIN 就可以了
感謝 我試試看
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

2
Zed_Yang
iT邦新手 3 級 ‧ 2020-04-08 16:42:28
最佳解答
SELECT 表A.Part, CASE WHEN 表B.user = @user THEN 'Y' ELSE '' END
  FROM 表A
  JOIN 表B ON 表B.Part = 表A.Part
  

以上MSSQL

更新
有可能有商品沒有任何賣出紀錄 ,故紀錄檔中沒有該商品
所以改用LEFT JOIN

SELECT TableA.Part, CASE WHEN TableB.userID = 'User1' THEN 'Y' ELSE '' END Ans
  FROM TableA
  LEFT JOIN TableB ON TableB.Part = TableA.Part
看更多先前的回應...收起先前的回應...

感謝回復 我在想想看

Zed_Yang iT邦新手 3 級 ‧ 2020-04-09 10:26:58 檢舉

順便解釋一下@user
如果沒猜錯
你表二的user欄位 應該是註記哪個使用者購買的
那就看登入資訊(@user)怎麼去對應user欄位
userID? IDNo? CusNo?

感謝你 可是我使用的是mysql 所以語法有點問題 我先試試看"石頭"的方法

Zed_Yang iT邦新手 3 級 ‧ 2020-04-09 12:01:19 檢舉

錯誤訊息貼一下吧
兩者語法不會差太多

我是這樣打拉 因為我沒使用過MS所以直接照者打
這樣是列印一個null給我

$status="well";
$sql="SELECT part_number.id, CASE WHEN app_shop_favorite.user_id = '$status' THEN 'Y' ELSE '' END
  FROM part_number
  JOIN app_shop_favorite ON app_shop_favorite.user_id = part_number.id"; 
Zed_Yang iT邦新手 3 級 ‧ 2020-04-09 14:40:38 檢舉

你JOIN打錯了
關聯是id 不是user_id

附上測試資料http://sqlfiddle.com/#!9/0252a6/2

$status="well";
$sql="SELECT part_number.id, CASE WHEN app_shop_favorite.user_id = '$status' THEN 'Y' ELSE '' END
  FROM part_number
  JOIN app_shop_favorite ON app_shop_favorite.id = part_number.id"; 

成功是成功了 但這樣列印只有表B 項目 我自己亂改了一下
傳送門
1.這是列印表B

SELECT TableA.Part, CASE WHEN TableB.userID = 'User1' THEN 'Y' ELSE '' END Ans
  FROM TableA
  JOIN TableB ON TableB.Part = TableA.Part

2.這可以列印表A但項目會重複

SELECT TableA.Part, CASE WHEN TableB.userID = 'User1' THEN 'Y' ELSE '' END Ans
  FROM TableB
  JOIN TableA ON TableA.Part = TableA.Part
Zed_Yang iT邦新手 3 級 ‧ 2020-04-10 10:14:01 檢舉
SELECT TableA.Part, CASE WHEN TableB.userID = 'User1' THEN 'Y' ELSE '' END Ans
  FROM TableA
  LEFT JOIN TableB ON TableB.Part = TableA.Part

改LEFT JOIN就可以了
LEFT JOIN 是依主要Table (FROM TableA)為主
有哪些商品全都show

JOIN 預設是INNER JOIN
需要兩邊都有商品紀錄 資料才會跑出來
我注意到你商品檔有原子筆 但購買紀錄檔沒有人買過原子筆
也就是表A.ID有資料 但表B.ID沒資料
所以JOIN 才跑不出原子筆的資料

樓主這方面可以多查關於
LEFT JOIN
INNER JOIN
RIGHT JOIN
OUTER JOIN
差異性 並且熟練會很有幫助
測試資料

了解 我再來研究一下 這幾個的差異

1
石頭
iT邦高手 1 級 ‧ 2020-04-08 19:12:59

可以使用OUTER JOIN和聚合函數.

SELECT A.Part,
	   MAX(B.User IS NOT NULL) c
FROM A 
LEFT JOIN B ON A.Part = B.Part
GROUP BY A.Part

Note

MAX(B.User IS NOT NULL)

  • 1 代表有匹配到
  • 0 代表沒匹配到

不好意思 我參考你的範例 這樣會變成指列印有1的0的不會顯示

$status="w0630";
$sql="select part_number.id, MAX(app_shop_favorite.user_id IS NOT NULL) ans
FROM part_number 
LEFT JOIN app_shop_favorite ON part_number.id =  app_shop_favorite.part_no
where user_id='$status'
GROUP BY part_number.id"; 

表A
https://ithelp.ithome.com.tw/upload/images/20200409/201096854rCzD1h81Y.png
表B
https://ithelp.ithome.com.tw/upload/images/20200409/20109685DgouqhtJRW.png

我要發表回答

立即登入回答