Задавайте вопросы, мы ответим
Вы не зашли.
Есть 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 или им обоим?
Неактивен
Благодарю за напутствие! тема закрыта.
Неактивен