2015-11-16 2 views
1

У меня есть две MySQL таблицы:MySQL LEFT JOIN с условием из другой таблицы

стол-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 ║ 
╚══════════╩══════╩══════╝ 

Как могу ли я ВСПОМОГАТЬСЯ в эти таблицы с условиями, чтобы он мог выводить первую таблицу?

+0

Я считаю, что ваш 'WHERE' оговорка проблема. –

+2

Удалить условие i.catid = 1 –

ответ

1

LEFT JOIN похож на INNER JOIN, за исключением того, что он будет возвращать каждую запись по крайней мере один раз, заменяя отсутствующие поля с b значениями NULL, если фактических совпадающих записей нет.

Условие WHERE, однако, оценивается после LEFT JOIN, поэтому запрос выше проверяет столбец после того, как он был соединен. Значение NULL не может удовлетворять условию равенства, поэтому записи из a без соответствующей записи из b неизбежно будут отфильтрованы.

По существу, этот запрос является INNER JOIN, но менее эффективным.

Чтобы соответствовать только записи с b.column = «что-то» (в то же время возвращаются все записи из а), это условие должно быть перемещен в положение о:

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