SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 07.12.2010 07:45:41

Arzamas
Участник
Зарегистрирован: 07.12.2010
Сообщений: 16

Не верно работает запрос

Есть 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 при заполнении таблиц - проверил - вроде все верно!

Неактивен

 

#2 07.12.2010 09:43:58

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Не верно работает запрос

Пишите в виде
FROM table1 INNER JOIN table2 ON 'условие связи' INNER JOIN table3 ON 'условие связи';
а то очень сложно разобраться в запросе. Например, у вас написано LI_prodavec INNER JOIN LI_pokupatel, а в части ON нет условия, которое связывало бы эти таблицы напрямую.

А также приведите тестовые данные, результат выборки по ним и укажите какие строки являются лишними.

Неактивен

 

#3 07.12.2010 18:30:41

Arzamas
Участник
Зарегистрирован: 07.12.2010
Сообщений: 16

Re: Не верно работает запрос

Код:

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

Неактивен

 

#4 07.12.2010 21:24:41

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Не верно работает запрос

Содержимое таблиц приведите.

Неактивен

 

#5 07.12.2010 21:54:34

Arzamas
Участник
Зарегистрирован: 07.12.2010
Сообщений: 16

Re: Не верно работает запрос

Код:

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);

Неактивен

 

#6 07.12.2010 22:30:44

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Не верно работает запрос

Рассмотрим продавца Лепешкину:

Если предположить, что 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 или им обоим?

Неактивен

 

#7 07.12.2010 22:54:29

Arzamas
Участник
Зарегистрирован: 07.12.2010
Сообщений: 16

Re: Не верно работает запрос

Благодарю за напутствие! тема закрыта.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson