![]() |
Задавайте вопросы, мы ответим
Вы не зашли.
Есть 5 таблиц:LI_prodavec и Id_pokupatel - личная информация продавцов и покупателей, Tovary - товары, Pokupki - таблица из 2 колонок-Id_pokupatel и Id_tovar, который он купил, Prodagi - то же самое - Id_prodavec и Id_tovar, который он продал.
Создаю запрос:
SELECT LI_prodavec.L_name, LI_pokupatel.Lsname, Tovary.Name, Tovary.Price FROM LI_prodavec INNER JOIN LI_pokupatel INNER JOIN Prodagi INNER JOIN Tovary INNER JOIN Pokupki ON Prodagi.Id_prodavec=LI_prodavec.id AND Pokupki.Id_pokupatel=LI_pokupatel.Id AND Tovary.id=Prodagi.Id_tovar AND Tovary.id=Pokupki.Id_tovar ORDER BY Lsname;
Запрос в принципе работает верно (удостоверился ручной проверкой), но вместо 7 строк, он выдает 9 - т.е. лишние 2. Ни как не могу разобраться где ошибка.
Подумал что где то ошибся в ID при заполнении таблиц - проверил - вроде все верно!
Неактивен

Пишите в виде
FROM table1 INNER JOIN table2 ON 'условие связи' INNER JOIN table3 ON 'условие связи';
а то очень сложно разобраться в запросе. Например, у вас написано LI_prodavec INNER JOIN LI_pokupatel, а в части ON нет условия, которое связывало бы эти таблицы напрямую.
А также приведите тестовые данные, результат выборки по ним и укажите какие строки являются лишними.
Неактивен
SELECT LI_prodavec.L_name, LI_pokupatel.Lsname, Tovary.Name, Tovary.Price FROM LI_prodavec INNER JOIN Prodagi ON Prodagi.Id_prodavec=LI_prodavec.id INNER JOIN Tovary ON Tovary.id=Prodagi.Id_tovar INNER JOIN Pokupki ON Tovary.id=Pokupki.Id_tovar INNER JOIN LI_pokupatel ON Pokupki.Id_pokupatel=LI_pokupatel.Id ORDER BY Lsname;
Вот результат этого запроса (строки помеченные -- являются лишними):
Вересович Антонов HERO 31200
Лепешкина Куприянов DELL x3 23000
Лаптев Романенко Клавиатура H1 700
--Лепешкина Романенко Клавиатура H1 700--
Лаптев Романенко Мышь 370
Вересович Светлаков ASUS H2 27500
Вересович Светлаков HP 1513 2570
--Лаптев Цветаева Logitech H1 700--
Лепешкина Цветаева Logitech H1 700
Неактивен

Содержимое таблиц приведите.
Неактивен
Insert into LI_pokupatel
(Fsname,Lsname, Age, Male, Email)
Values
(“Сергей”, “Куприянов”, 20, “муж”, “kupriyan@mail.ru”),
(“Алена”, “Романенко”, 27, “жен”, “alena@mail.ru”),
(“Егор”, “Антонов”, 34, “муж”, “antonov@rambler.ru”),
(“Максим”, “Светлаков”, 30, “муж”, “arzamas@rambler.ru”),
(“Светлана”, “Цветаева”, 41, “жен”, “sveta@rambler.ru”);
Insert into Tovary
(Name,Price,Stage,Nalichee)
Values
("Компьютер Dell x3",23000,5,"имеется"),
(“Компьютер ASUS H2",27500,6,"имеется"),
(“Компьютер ASUS HERO",31200,4,"имеется"),
(“Принтер HP 1513",2570,11,"имеется"),
(“Принтер HP L300",3700,9,"имеется"),
(“Мышь Logitech N3",370,27,"имеется"),
(“Клавиатура Logitech H1",700,24,"имеется");
Insert into Pokupki
(Id_pokupatel,Id_tovar)
Values
(1,1),
(2,6),
(2,7),
(3,3),
(4,2),
(4,4),
(5,7);
Insert into LI_prodavec
(F_name,L_name,Male,Age,Opit)
Values
(“Михаил”,“Лаптев”,“муж”,31,7),
(“Юлия”,“Лепешкина”,“жен”,27,2),
(“Дарья”,“Вересович”,“жен”,37,9);
Insert into Prodagi
(Id_prodavec,Id_tovar)
Values
(1,6),
(1,7),
(2,1),
(2,7),
(3,2),
(3,4),
(3,3);Неактивен

Рассмотрим продавца Лепешкину:
Если предположить, что id у вас пронумерованны по порядку, то её id=2
Объединение с таблице продаж
LI_prodavec INNER JOIN Prodagi ON Prodagi.Id_prodavec=LI_prodavec.id
даст 2 строчки:
(2,1),
(2,7),
Далее объединяем с товарами
INNER JOIN Tovary ON Tovary.id=Prodagi.Id_tovar
по прежнему 2 строки
Tovary.id=1 ("Компьютер Dell x3",23000,5,"имеется"),
Tovary.id=7 (“Клавиатура Logitech H1",700,24,"имеется");
Далее объединяем с таблицей покупок
INNER JOIN Pokupki ON Tovary.id=Pokupki.Id_tovar
получим уже 3 строки
(1,1),
(2,7),
(5,7);
Теперь объединяя с покупателем
INNER JOIN LI_pokupatel ON Pokupki.Id_pokupatel=LI_pokupatel.Id
получим 3 строки
“Куприянов”
“Романенко”
“Цветаева”
С чего вы сделали вывод о том, что строка
--Лепешкина Романенко Клавиатура H1 700--
является лишней?
У вас это сакральное знание, в базе оно никак не отображено.
В таблице покупки у вас есть
(2,7),
(5,7)
а в таблице продажи
(1,7),
(2,7)
Каким образом установить цепочку продавец-товар-покупатель?
В данной реализации никак. Откуда сервер может знать, что продавец под номером 2 продал товар №7 именно покупателю №5, а не №2 или им обоим?
Неактивен
Благодарю за напутствие! тема закрыта.
Неактивен