Запрос возвращает слишком мало строк - PullRequest
0 голосов
/ 07 октября 2009

настройка:

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 мне нужно выполнить?

Ответы [ 5 ]

2 голосов
/ 07 октября 2009

INNER соединение вернет только те строки, которые совпадают в обеих таблицах. Именно поэтому результаты, для которых нет строки в таблице запасов, не возвращают результатов.

Соединение LEFT вернет все строки в первой таблице, а соединение RIGHT вернет все строки во второй таблице.

В вашем запросе вы ожидаете всех результатов из второй таблицы, поэтому замените INNER соединение на RIGHT соединение.

Здесь есть учебник с некоторыми примерами:

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

1 голос
/ 07 октября 2009

Выполните внешнее соединение от product до product_stock, а не внутреннее соединение от product_stock до product.

(Хорошая работа по разъяснению, полноте и недвусмысленности вопроса.)

1 голос
/ 07 октября 2009

Вам нужно перевернуть соединение и использовать левое соединение вместо внутреннего соединения:

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 голосов
/ 07 октября 2009

Если вы используете таблицу запасов в качестве базы, то вы получите только один предмет, поскольку он имеет только 1 точку ссылки на другую таблицу.

Используйте таблицу продуктов и присоединитесь к таблице запасов. Возможно, вы получите NULL в качестве стоимости акций, но вы можете справиться с этим с помощью кода на стороне сервера.

0 голосов
/ 07 октября 2009

Если я правильно прочитал ваш вопрос, все, что вам нужно сделать, это изменить ваш INNER JOIN на RIGHT OUTER JOIN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...