MySQL оставил объединить дублировать строки моей таблицы - почему? - PullRequest
2 голосов
/ 29 мая 2011

У меня есть 2 таблицы:

  • Table1 => product_id, product_quantity => здесь у меня 25 строк.
  • Table2 => product_hashid, order_quantity => здесь у меня 1 запрос строка.

Я создаю этот запрос mysql:

SELECT SUM(table1.product_quantity) - SUM(order_quantity) AS instocks
  FROM table1  -- table.1 in original
  LEFT JOIN table2 ON table2.product_hashid = table1.product_id
 WHERE table1.product_id = '$thisid'

Этот запрос дублирует строку таблицы2 с таблицей1.Есть ли какая-то ошибка в этом запросе?

Сначала я хочу сложить все product_quantity из table1, где product_id = '$this', и суммировать все order_quantity в table2, где product_hashid = '$this' и сделать (a- б) для отображения окончательного результата.

Ответы [ 3 ]

2 голосов
/ 29 мая 2011

Ваш план того, что вы хотите сделать, хорош, но это не то, что вы реализовали.

  • Я хочу суммировать все product_quantity из table1, где product_id = '$this', и суммировать все order_quantity в table2, где product_hashid = '$this' и сделать (a - b) для отображения окончательного результата.

Создайте его по одному шагу за раз.

SELECT SUM(product_quantity) FROM Table1 WHERE Product_ID = '$this';

SELECT SUM(order_quantity) FROM Table2 WHERE Product_HashID = '$this';

SELECT (SELECT SUM(product_quantity) FROM Table1 WHERE Product_ID     = '$this') -
       (SELECT SUM(order_quantity)   FROM Table2 WHERE Product_HashID = '$this')
  FROM Dual;

Вы можете заметить, что выравнивание кода подчеркивает несогласованное именование столбцов для столбцов идентификатора продукта.


В более общем случае:

SELECT Product_ID, SUM(product_quantity) AS Product_Quantity
  FROM Table1
 GROUP BY Product_ID;

SELECT Product_HashID AS Product_ID, SUM(order_quantity) AS Order_Quantity
  FROM Table2
 GROUP BY Product_HashID;

SELECT p.Product_ID, p.Product_Quantity - o.Order_Quantity AS SurplusOnHand
  FROM (SELECT Product_ID, SUM(product_quantity) AS Product_Quantity
          FROM Table1
         GROUP BY Product_ID) AS P
  JOIN (SELECT Product_HashID AS Product_ID, SUM(order_quantity) AS Order_Quantity
          FROM Table2
         GROUP BY Product_HashID) AS O
    ON O.Product_ID = P.Product_ID;

Иногда вам нужно использовать LEFT OUTER JOIN; в основном, нет. Напишите свой SQL, предполагая, что вы этого не сделаете, пока не будете уверены, что делаете.

Принимая во внимание количество элементов данных (количество строк), вам может потребоваться сделать LOJ здесь. Вам необходимо изготовить ноль для количества заказа тех продуктов, перечисленных в Таблице 1, которые не перечислены в Таблице 2.

SELECT    (SELECT SUM(product_quantity) FROM Table1 WHERE Product_ID     = '$this') -
       NVL(SELECT SUM(order_quantity)   FROM Table2 WHERE Product_HashID = '$this'), 0)
  FROM Dual;


SELECT p.Product_ID, p.Product_Quantity - NVL(o.Order_Quantity, 0) AS SurplusOnHand
  FROM (SELECT Product_ID, SUM(product_quantity) AS Product_Quantity
          FROM Table1
         GROUP BY Product_ID) AS P
  LEFT OUTER JOIN
       (SELECT Product_HashID AS Product_ID, SUM(order_quantity) AS Order_Quantity
          FROM Table2
         GROUP BY Product_HashID) AS O
    ON O.Product_ID = P.Product_ID;
1 голос
/ 29 мая 2011

LEFT JOIN вернет все table1 в каждом случае.http://www.w3schools.com/sql/sql_join_left.asp

Вы действительно хотите только продукты в таблице 1, если они появляются в таблице 2?Если это так, вам нужно просто ПРИСОЕДИНИТЬСЯ (или ВНУТРЕННЕЕ СОЕДИНЕНИЕ) http://www.w3schools.com/sql/sql_join_inner.asp

0 голосов
/ 29 мая 2011

Я думаю, что проблема заключается в вашем JOIN и предложении WHERE. В этой настройке вы вернете все данные из таблицы 2, что даст вам беспорядок. Предложение WHERE просматривает table1 и ограничивает количество строк, но JOIN возвращает все строки из table2 и только те строки из table1, которые равны.

Итог: измените ваше соединение на ВНУТРЕННЕЕ, и ваши проблемы исчезнут.

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