查询返回的行数太少

时间:2009-10-07 08:53:35

标签: mysql

设置:

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 :(得分:0)

您的问题在于where子句:

WHERE branch_id = 1 

由于库存0的商品没有product_stock记录,因此也没有branch_id,因此该记录没有结果行。
尝试不带where子句的查询,你应该有3个结果。

答案 1 :(得分: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_idNULL替换为OUTER JOIN