我有两个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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句