设置:
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查询?
答案 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_id
将NULL
替换为OUTER JOIN