Запрос возвращает слишком мало строк - PullRequest
0 голосов
/ 07 октября 2009

настройка:

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 ]

0 голосов
/ 07 октября 2009

Переместить условие в предложение 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 голосов
/ 07 октября 2009

Ваша проблема с предложением where:

WHERE branch_id = 1 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...