Это мои выборочные данные
-- schema
CREATE TABLE Cart (
Id_cart INT NOT NULL,
Id_product VARCHAR(25)
);
CREATE TABLE Orders (
Id INT,
Id_cart INT NOT NULL,
Id_vendor INT NOT NULL,
status VARCHAR(25),
order_no VARCHAR(25)
);
-- data
INSERT INTO Cart
(Id_cart, Id_product)
VALUES
(1, 'abc002'),
(1, 'abc003')
;
INSERT INTO Orders
(Id, Id_cart,Id_vendor,status,order_no)
VALUES
(1, 1,1, 'pending','aaa001'),
(2, 1,2, 'pending','aaa002')
;
Я использую этот запрос для показа записи.
Select c.id_cart,order_no,id_product from cart as c
left join (SELECT id_cart,status,order_no FROM orders) o using(id_cart)
Результат, который я получаю
id_cart order_no id_product
1 aaa002 abc002
1 aaa001 abc002
1 aaa002 abc003
1 aaa001 abc003
Результат, который я ожидал
id_cart order_no id_product
1 aaa001 abc002
1 aaa002 abc003
Что-то не так с моим запросом? Как я могу удалить дубликат записи?
Скажем, я добавил столбец vendor_id в таблицу заказов. Каждый order_no принадлежит одному поставщику, а id_cart принадлежит многим поставщикам. Когда я пытаюсь отобразить свой продукт, я хочу отобразить order_no и мой id_product.
Например, у меня есть корзина, принадлежащая двум заказам
Во время отображения выход должен быть
order_no | product_id
order1 | A
order1 | B
order2 | C
order2 | D
Теперь моя проблема в том, что каждый order_no будет loop для каждого product_id. Как я могу это преодолеть?
Вы хотите показать тележку вместе с их заказами. Тележки содержат продукты от разных поставщиков, для которых существуют отдельные заказы. Поэтому присоедините таблицу продуктов к корзине, чтобы узнать поставщика и только затем присоединиться к таблице заказов.
select
id_cart,
o.order_no,
id_product
from cart c
join product p using (id_product)
join orders o using (id_cart, id_vendor);
Если вам также нужны тележки, для которых заказ еще не написан, сделайте заказы присоединенными к внешнему соединению.
ОБНОВЛЕНИЕ: Когда вы сообщаете о проблеме с "Неизвестным столбцом" id_vendor в разделе "from", здесь вместо этого следует запрос с предложениями ON:
select
c.id_cart,
o.order_no,
c.id_product
from cart c
join product p on p.id_product = c.id_product
join orders o on o.id_cart = c.id_cart and o.id_vendor = p.id_vendor;
USING
предложения ON
. Может быть, MySQL имеет проблемы с этим.
SELECT c.id_cart,order_no,id_product FROM cart AS c
left join (SELECT id_cart,status,order_no FROM orders) o using(id_cart) GROUP BY o.order_no
Пример: - http://sqlfiddle.com/#!9/b6b118/6/0
left join orders o
), но больше всего: это неверный запрос в соответствии со стандартом SQL. MySQL пропускает это и возвращает произвольно выбранные id_cart
и id_product
для order_no
. Это даже не должно происходить из одной и той же записи - СУБД может свободно выбирать любую корзину и любой продукт, связанный с заказом. Я предлагаю вам удалить этот ответ или заменить его на ответ, уточняющий проблему и содержащий запрос, возвращающий id_cart и id_product из одной и той же записи.