2009-10-07 7 views
-1

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

mysql> create table product_stock(
     product_id integer, qty integer, branch_id 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, branch_id) 
     values(1, 100, 1); 
Query OK, 1 row affected (0.03 sec) 

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

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

мой запрос:

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

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

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

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

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

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

+2

Это qu estion должен быть на SO. И если он уже существует, как указывает Арьян ван Бентем, его следует просто закрыть. – alex

+0

Возможный дубликат [Query возвращает слишком мало строк] (http://stackoverflow.com/questions/1530021/query-returns-too-few-rows) – Welbog

+0

Возможный дубликат [Запрос не возвратил все строки] (http://stackoverflow.com/questions/1530396/query-did-not-return-all-rows) – Tareq

ответ

0

Переместить условие в предложении JOIN:

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

или просто переписать его как подзапрос:

SELECT (
     SELECT COALESCE(SUM(qty), 0) 
     FROM product_stock s 
     WHERE s.product_id = p.product_id 
       AND s.branch_id = 0 
     ) AS stock, 
     product_name 
FROM product p 
ORDER BY 
     p.product_name 

WHERE оценивается после JOIN, поэтому недостающие продукты отфильтровываются (их branch_id заменяется на NULL на OUTER JOIN)

0

Вашей проблема с ИНЕК:

WHERE branch_id = 1 

Как элемент с акцией-не имеет product_stock записи, там тоже нет branch_id, так что нет никакого результата строки для этой записи.
Попробуйте свой запрос без предложения where, и у вас должно быть 3 результата.

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