设置:
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查询?
答案 0 :(得分:2)
INNER联接只返回两个表中匹配的行。这就是为什么库存表中没有行的结果不会返回结果。
LEFT join将返回第一个表中的所有行,而RIGHT join将返回第二个表中的所有行。
在您的查询中,您期望第二个表中的所有结果,因此请将您的INNER联接更改为RIGHT联接。
这里有一个教程,有一些例子:
http://www.wellho.net/mouth/158_MySQL-LEFT-JOIN-and-RIGHT-JOIN-INNER-JOIN-and-OUTER-JOIN.html
答案 1 :(得分:1)
执行从product
到product_stock
的外部联接,而不是从product_stock
到product
的内部联接。
(使问题清晰,完整,明确无误的好工作。)
答案 2 :(得分: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;
答案 3 :(得分:0)
如果我已正确阅读您的问题,您只需将INNER JOIN
更改为RIGHT OUTER JOIN
。
答案 4 :(得分:0)
如果您使用股票表作为基础,那么您将只获得一个项目,因为它只有1个参考点到另一个表。
使用产品表并加入库存表。您可能会获得NULL作为股票价值,但您可以使用服务器端代码处理它。