Повторяющаяся проблема записи по запросу

0

Это мои выборочные данные

-- 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.

Например, у меня есть корзина, принадлежащая двум заказам

  1. заказ принадлежит поставщику A (1) и состоит из продуктов A и B.
  2. заказ принадлежит поставщику B (2) и состоит из продуктов C и D.

Во время отображения выход должен быть

order_no | product_id
order1   | A
order1   | B
order2   | C
order2   | D

Теперь моя проблема в том, что каждый order_no будет loop для каждого product_id. Как я могу это преодолеть?

  • 0
    Двойной записи нет. 1 | aaa002 | abc002 отличается от 1 | aaa002 | abc003, как вы можете ясно видеть. То, что вы ищете, - это агрегирование по id_cart и order_no.
  • 1
    Id_cart одинакова для всех записей.
Показать ещё 9 комментариев
Теги:

2 ответа

1
Лучший ответ

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

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;
  • 0
    Он показывает ошибку Неизвестный столбец 'id_vendor' в 'из условия'
  • 0
    Но id_vendor существует в заказах и продуктах !? Что ж, я обновлю свой ответ и заменю предложения USING предложения ON . Может быть, MySQL имеет проблемы с этим.
Показать ещё 1 комментарий
1

Просто добавьте GROUP BY в свой sql-запрос

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

  • 0
    я должен объяснить, что мне действительно нужно.
  • 0
    Мне не нравится этот ответ вообще. Он по-прежнему использует ненужный подзапрос (вместо простого использования left join orders o ), но больше всего: это неверный запрос в соответствии со стандартом SQL. MySQL пропускает это и возвращает произвольно выбранные id_cart и id_product для order_no . Это даже не должно происходить из одной и той же записи - СУБД может свободно выбирать любую корзину и любой продукт, связанный с заказом. Я предлагаю вам удалить этот ответ или заменить его на ответ, уточняющий проблему и содержащий запрос, возвращающий id_cart и id_product из одной и той же записи.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню