簡體   English   中英

mysql LEFT JOIN與其他表的條件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM