2009-10-07 146 views
0

設置:查詢返回太少行

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查詢?

回答

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; 
0

如果我已經閱讀了您的問題,您需要做的就是將您的INNER JOIN更改爲RIGHT OUTER JOIN

+0

RIGHT OUTER JOIN不起作用。 – Tareq 2009-10-07 07:26:29

1

做一個從productproduct_stock的外連接,而不是從product_stockproduct的內連接。

(上使問題清晰,完整和明確的好的作品。)

+0

感謝您的評論。 – Tareq 2009-10-07 07:29:52

0

如果您正在使用股票表作爲基礎,那麼你只會得到一個項目,因爲它只有一個參考點到另一個表。

使用產品表並加入庫存表。您可能會獲得NULL作爲股票價值,但您可以使用服務器端代碼處理。

+0

我需要一些更復雜的任務來完成。所以我需要按照我的要求得到結果。 – Tareq 2009-10-07 07:27:27

2

INNER連接將只返回在兩個表中都有匹配的行。這就是股票表中沒有行的結果返回結果的原因。

LEFT連接將返回第一個表中的所有行,並且RIGHT連接將返回第二個表中的所有行。

在您的查詢中,您期待第二張表的所有結果,因此將您的INNER連接更改爲右連接。

這裏有一個教程,有一些例子:

http://www.wellho.net/mouth/158_MySQL-LEFT-JOIN-and-RIGHT-JOIN-INNER-JOIN-and-OUTER-JOIN.html

+0

非常好的解釋。謝謝安德烈。如果我想連接兩個表中的所有行,那我該怎麼辦? – Tareq 2009-10-07 07:36:58

+1

要從兩個表中返回所有結果,您需要一些名爲'FULL OUTER JOIN'的內容,但不幸的是,MySQL不直接支持這種類型的聯接。但是,您可以使用兩個連接來模擬它:http://en.wikipedia.org/wiki/Join_%28SQL%29#Full_outer_join – 2009-10-07 07:44:55

+0

親愛的安德烈,現在我在股票表中添加另一個字段branch_id。當我使用where子句時,只返回匹配的行。有沒有辦法從產品表中返回庫存表中特定branch_id的所有行? – Tareq 2009-10-07 08:21:40