2009-10-07 3 views
0

установка:запрос возвращает слишком мало строк

mysql> create table product_stock(
     product_id integer, qty integer); 
Query OK, 0 rows affected (0.17 sec) 

mysql> create table product(
     product_id integer, product_name varchar(255)); 
Query OK, 0 rows affected (0.11 sec) 

mysql> insert into product(product_id, product_name) 
     values(1, 'Apsana White DX Pencil'); 
Query OK, 1 row affected (0.05 sec) 

mysql> insert into product(product_id, product_name) 
     values(2, 'Diamond Glass Marking Pencil'); 
Query OK, 1 row affected (0.03 sec) 

mysql> insert into product(product_id, product_name) 
     values(3, 'Apsana Black Pencil'); 
Query OK, 1 row affected (0.03 sec) 

mysql> insert into product_stock(product_id, qty) 
     values(1, 100); 
Query OK, 1 row affected (0.03 sec) 

мой первый запрос:

mysql> SELECT IFNULL(SUM(s.qty),0) AS stock, 
       product_name 
     FROM product_stock s 
     INNER JOIN product p ON p.product_id=s.product_id 
     GROUP BY product_name 
     ORDER BY product_name; 

возвращается:

+-------+---------------------------+ 
| stock | product_name    | 
+-------+---------------------------+ 
| 100 | Apsana White DX Pencil | 
+-------+---------------------------+ 
1 row in set (0.00 sec) 

Но я хочу иметь следующий результат:

+-------+------------------------------+ 
| stock | product_name     | 
+-------+------------------------------+ 
| 0 | Apsana Black Pencil   | 
| 100 | Apsana White DX Pencil  | 
| 0 | Diamond Glass Marking Pencil | 
+-------+------------------------------+ 

Чтобы получить этот результат, какой запрос mysql следует запустить?

ответ

1

Вы должны переворачивать присоединиться вокруг и использовать LEFT JOIN вместо INNER JOIN:

SELECT IFNULL(SUM(s.qty),0) AS stock, product_name 
FROM product AS p 
LEFT JOIN product_stock AS s ON p.product_id=s.product_id 
GROUP BY product_name 
ORDER BY product_name; 
0

Если я правильно прочитал ваш вопрос, все, что вам нужно сделать, это изменить свой INNER JOIN на RIGHT OUTER JOIN.

+0

RIGHT OUTER JOIN не работает. – Tareq

1

Сделайте внешнее соединение от product до product_stock, а не внутреннее соединение от product_stock до product.

(Хорошая работа по изготовлению вопрос ясно, полной и однозначной.)

+0

Спасибо за ваш комментарий. – Tareq

0

Если вы используете таблица запасов в качестве базы, то вы получите только один элемент, так как он имеет только одну точку ссылки на другую таблицу.

Используйте таблицу продуктов и присоединитесь к столу. Вероятно, вы получите NULL как стоимость акции, но вы можете обработать это с помощью кода на стороне сервера.

+0

Мне нужна более сложная задача. Поэтому мне нужен результат, как я просил. – Tareq

2

Соединение INNER будет возвращать только строки, имеющие соответствие в обеих таблицах. Вот почему результаты, для которых нет строки в таблице запасов, не дают результатов.

LEFT join вернет все строки в первой таблице, а RIGHT join вернет все строки во второй таблице.

В вашем запросе вы ожидаете всех результатов со второй таблицы, поэтому измените свое соединение INNER на правое соединение.

Существует учебник здесь, с некоторыми примерами:

http://www.wellho.net/mouth/158_MySQL-LEFT-JOIN-and-RIGHT-JOIN-INNER-JOIN-and-OUTER-JOIN.html

+0

Очень хорошее объяснение. Спасибо Андре. Если я хочу присоединиться ко всем строкам из обеих таблиц, то что мне делать? – Tareq

+1

Чтобы вернуть все результаты из обеих таблиц, вам понадобится что-то, называемое «FULL OUTER JOIN», но, к сожалению, MySQL не поддерживает этот тип соединения напрямую. Однако вы можете эмулировать его с помощью двух соединений: http://en.wikipedia.org/wiki/Join_%28SQL%29#Full_outer_join –

+0

Дорогой Андре, теперь я добавляю еще одно поле в таблицу запаса, называемое branch_id. Когда я использую предложение where, возвращаются только соответствующие строки. Есть ли способ вернуть все строки из таблицы продуктов, где конкретный branch_id в таблице запасов? – Tareq

Смежные вопросы