[英]mysql LEFT JOIN with condition from other table
我有兩個mysql表:
表1: table_item
╔════╦═══════╦════════╦══════════╗
║ id ║ catid ║ itemid ║ itemname ║
╠════╬═══════╬════════╬══════════╣
║ 1 ║ 1 ║ 1 ║ Pen ║
║ 2 ║ 1 ║ 2 ║ Pencil ║
║ 3 ║ 1 ║ 3 ║ Sharpner ║
║ 4 ║ 2 ║ 4 ║ Book ║
║ 5 ║ 2 ║ 5 ║ Notebook ║
║ 6 ║ 3 ║ 6 ║ Pant ║
║ 7 ║ 4 ║ 7 ║ Shirt ║
╚════╩═══════╩════════╩══════════╝
表2: 2015年出價
╔════╦════════╦══════╦══════╗
║ id ║ itemid ║ year ║ rate ║
╠════╬════════╬══════╬══════╣
║ 1 ║ 1 ║ 2015 ║ 3.0 ║
║ 2 ║ 2 ║ 2015 ║ 5.0 ║
║ 3 ║ 5 ║ 2015 ║ 7.0 ║
║ 4 ║ 1 ║ 2016 ║ 3.5 ║
║ 5 ║ 5 ║ 2016 ║ 7.8 ║
║ 6 ║ 7 ║ 2016 ║ 20.0 ║
╚════╩════════╩══════╩══════╝
我想得到如下結果:
成績表:2015年
╔══════════╦══════╦══════╗
║ itemname ║ rate ║ year ║
╠══════════╬══════╬══════╣
║ Pen ║ 3.0 ║ 2015 ║
║ Pencil ║ 5.0 ║ 2015 ║
║ Sharpner ║ null ║ null ║
╚══════════╩══════╩══════╝
如果我運行以下查詢,將獲得以上結果表:
SELECT i.itemname, b.rate, b.year
FROM table_item i LEFT JOIN bid-2015 b ON i.itemid=b.itemid
WHERE i.catid=1 AND b.year=2015
然后它給了我以下輸出:
╔══════════╦══════╦══════╗
║ itemname ║ rate ║ year ║
╠══════════╬══════╬══════╣
║ Pen ║ 3.0 ║ 2015 ║
║ Pencil ║ 5.0 ║ 2015 ║
║ Notebook ║ 7.0 ║ 2015 ║
╚══════════╩══════╩══════╝
我該如何用條件左聯接那些表,以便它可以輸出第一個表?
LEFT JOIN類似於INNER JOIN,不同之處在於它會至少返回一次來自a的每條記錄,如果沒有實際匹配的記錄,則將b中的缺失字段替換為NULL值。
但是,WHERE條件是在LEFT JOIN之后評估的,因此上面的查詢在連接后會檢查該列。 沒有NULL值不能滿足相等條件,因此將不可避免地過濾掉a中的記錄而b中沒有相應的記錄。
本質上,此查詢是一個INNER JOIN,僅效率較低。
為了只匹配b.column ='something'的記錄(同時仍從a返回所有記錄),此條件應移至ON子句中:
SELECT i.itemname,b.rate,b.year
from table_item i
LEFT JOIN bid-2015 b
ON i.itemid=b.itemid
AND i.catid=1 AND b.year=2015
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.