簡體   English   中英

查詢返回的行太少

[英]Query returns too few rows

設定:

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

INNER聯接將僅返回兩個表中都具有匹配項的行。 這就是為什么庫存表中沒有行的結果不返回任何結果的原因。

向左聯接將返回第一個表中的所有行,向右聯接將返回第二個表中的所有行。

在查詢中,您期望第二個表中的所有結果,因此將您的INNER聯接更改為RIGHT聯接。

這里有一個教程,並提供了一些示例:

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

productproduct_stock進行外部product_stock ,而不是從product_stockproduct進行內部product_stock

(在使問題清晰,完整和明確的方面做得很好。)

您需要翻轉聯接並使用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;

如果我已正確閱讀您的問題,則只需將您的INNER JOIN更改為RIGHT OUTER JOIN

如果您使用庫存表作為基礎,那么您只會得到一個項目,因為它只有一個參考點指向另一個表。

使用產品表並加入庫存表。 您可能會得到NULL作為庫存值,但是您可以使用服務器端代碼來處理該值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM