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

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

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

Вы не зашли.

#1 19.08.2009 17:17:29

oleg999
Завсегдатай
Зарегистрирован: 19.08.2009
Сообщений: 48

Подскажите как выбрать данные из нескольких таблиц...

Мне необходимо выбрать данные из нескольких таблиц базы:
Делаю так:
select dirname.direction, typename.type, price.main, unitname.unit from direction, type,main,unit;
выдает ошибку:
ERROR 1054 (42S22): Unknown column 'dirname.direction' in 'field list'
Подскажите как сделать такой запрос
Спасибо...

Вот моя база:

CREATE TABLE unit
(
unitid  int AUTO_INCREMENT NOT NULL,
unitname  varchar(25) NOT NULL,
PRIMARY KEY(unitid)
) ENGINE=InnoDB;
CREATE TABLE type
(
typeid  int AUTO_INCREMENT NOT NULL,
typename  varchar(25) NOT NULL,
PRIMARY KEY(typeid)
) ENGINE=InnoDB;
CREATE TABLE direction
(
dirid  int AUTO_INCREMENT NOT NULL,
dirname  varchar(70) NOT NULL,
PRIMARY KEY(dirid)
) ENGINE=InnoDB;
CREATE TABLE main (
mainid  int AUTO_INCREMENT NOT NULL,
dirid  int NOT NULL,
typeid  int NOT NULL,
price int NOT NULL,
unitid int NOT NULL,
PRIMARY KEY(mainid),
FOREIGN KEY (dirid) REFERENCES direction(dirid)
ON UPDATE CASCADE
ON DELETE RESTRICT,
FOREIGN KEY (typeid) REFERENCES type(typeid)
ON UPDATE CASCADE
ON DELETE RESTRICT,
FOREIGN KEY (unitid) REFERENCES unit(unitid)
ON UPDATE CASCADE
ON DELETE RESTRICT
) ENGINE=InnoDB;
insert into unit value ('1','euro');
insert into unit value ('2','us dollar');
insert into  direction value ('1','Душанбе-Москва');                 
insert into  direction value ('2','Москва-Душанбе');                 
insert into  direction value ('3','Душанбе-Москва-Душанбе');       
insert into  direction value ('4','Душанбе-Красноярск');             
insert into  direction value ('5','Красноярск-Душанбе');             
insert into  direction value ('6','Душанбе-Красноярск-Душанбе');     
insert into  direction value ('7','Худжанд-Красноярск');             
insert into  direction value ('8','Красноярск-Худжанд');             
insert into  direction value ('9','Худжанд-Красноярск-Худжанд');     
insert into  direction value ('10','Душанбе-Санкт-Петербург');       
insert into  direction value ('11','Санкт-Петербург-Душанбе');       
insert into  direction value ('12','Душанбе-Санк-Петербург-Душанбе');
insert into  direction value ('13','Худжанд-Сочи');                   
insert into  direction value ('14','Сочи-Худжанд');                   
insert into  direction value ('15','Худжанд-Сочи-Худжанд');           
insert into  direction value ('16','Душанбе-Франкфурт-на-Майне');             
insert into  direction value ('17','Франкфурт-на-Майне-Душанбе');             
insert into  direction value ('18','Душанбе-Франкфурт-на-Майне-Душанбе');     
insert into  direction value ('19','Душанбе-Дубай');                 
insert into  direction value ('20','Дубай-Душанбе');                 
insert into  direction value ('21','Душанбе-Дубай-Душанбе');         
insert into  direction value ('22','Душанбе-Худжанд');               
insert into  direction value ('23','Худжанд-Душанбе');               
insert into  direction value ('24','Душанбе-Худжанд-Душанбе');

insert into type value ('1','бизнес-класс');
insert into type value ('2','бизнес повышенный');
insert into type value ('3','бизнес пониженный');
insert into type value ('4','эконом-класс');
insert into type value ('5','эконом повышенный');
insert into type value ('6','эконом пониженный');
insert into type value ('7','семейный');
insert into type value ('8','туристический');
insert into type value ('9','молодежный от 12 до 25 лет');

insert into main value ('1','1','1','351','1');

Неактивен

 

#2 19.08.2009 17:32:24

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

Re: Подскажите как выбрать данные из нескольких таблиц...

сначала пишется имя таблицы, а потом имя колонки, т.е.  direction.dirname

Неактивен

 

#3 19.08.2009 17:48:59

oleg999
Завсегдатай
Зарегистрирован: 19.08.2009
Сообщений: 48

Re: Подскажите как выбрать данные из нескольких таблиц...

В таком виде заработало,
"select direction.dirname, type.typename, main.price, unit.unitname from direction, type,main,unit;"
но запрос обрабатывается не правильно, т.е
выводятся это:
....
| Санкт-Петербург-Душанбе            | туристический             |   351 | euro      |
| Санкт-Петербург-Душанбе            | туристический             |   351 | us dollar |
| Санкт-Петербург-Душанбе            | молодежный от 12 до 25 ле |   351 | euro      |
|....

а по идеи должна выводиться строчка:
mainid     Dirname                 Type                price            unit 
   1           Душанбе-Москва    бизнес класс    351              euro

данные основной таблицы insert into main value ('1','1','1','351','1');

Подскажите почему выбрались все эти данные?Как нужно написать запрос чтобы было корректно...

Спасибо....

Неактивен

 

#4 19.08.2009 17:59:00

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

Re: Подскажите как выбрать данные из нескольких таблиц...

FROM table1, table2  -это прямое произведение таблиц, при котором для каждой строчки первой таблицы выбираются все из второй таблицы.
В вашем запросе необходимо добавить ограничения на выбор при объединениии таблиц.

http://dev.mysql.com/doc/refman/5.0/en/join.html

Неактивен

 

#5 19.08.2009 18:07:07

oleg999
Завсегдатай
Зарегистрирован: 19.08.2009
Сообщений: 48

Re: Подскажите как выбрать данные из нескольких таблиц...

А вы можете помочь мне написать данный запрос...очень нужно спасибо...

Неактивен

 

#6 19.08.2009 18:09:05

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

Re: Подскажите как выбрать данные из нескольких таблиц...

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


select m.price, d.dirname, t.typename, u.unitname
from main m left join direction d on m.dirid=d.dirid
 left join type t using(typeid)
 left join unit u using(unitid);

Неактивен

 

#7 19.08.2009 18:13:59

oleg999
Завсегдатай
Зарегистрирован: 19.08.2009
Сообщений: 48

Re: Подскажите как выбрать данные из нескольких таблиц...

Я сейчас попробую написать, только можно выслать синтакис на русском языке...

Неактивен

 

#8 19.08.2009 18:15:05

oleg999
Завсегдатай
Зарегистрирован: 19.08.2009
Сообщений: 48

Re: Подскажите как выбрать данные из нескольких таблиц...

А что такое m и d???

Неактивен

 

#9 19.08.2009 18:20:20

oleg999
Завсегдатай
Зарегистрирован: 19.08.2009
Сообщений: 48

Re: Подскажите как выбрать данные из нескольких таблиц...

А можете сделать этот запрос хотя бы по двум полям, т.е direction и type, что совсем запутался...

Неактивен

 

#10 19.08.2009 18:21:03

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

Re: Подскажите как выбрать данные из нескольких таблиц...

m и d это алиасы для таблиц main и direction, чтобы не писать каждый раз полностью название таблицы.

Не понял, какой синтаксис на русском?

Итоговый запрос выше. В нем для иллюстрации использованы различные формы записи
ON m.dirid=d.dirid  синоним USING(dirid)

Неактивен

 

#11 19.08.2009 18:29:17

oleg999
Завсегдатай
Зарегистрирован: 19.08.2009
Сообщений: 48

Re: Подскажите как выбрать данные из нескольких таблиц...

Пробую так выдает ошибку:
SELECT direction.dirid FROM main m LEFT JOIN direction d ON m.dirid=d.dirname;

Неактивен

 

#12 19.08.2009 18:30:53

oleg999
Завсегдатай
Зарегистрирован: 19.08.2009
Сообщений: 48

Re: Подскажите как выбрать данные из нескольких таблиц...

т.е так SELECT direction.dirid FROM main m LEFT JOIN direction d ON m.dirid=d.dirname;SELECT direction.dirid FROM main m LEFT JOIN direction d ON m.dirid=d.dirid;
тоже ошибка

Неактивен

 

#13 19.08.2009 18:32:19

oleg999
Завсегдатай
Зарегистрирован: 19.08.2009
Сообщений: 48

Re: Подскажите как выбрать данные из нескольких таблиц...

Все спасибо, вам огромное за помощь...

Неактивен

 

#14 19.08.2009 18:45:27

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

Re: Подскажите как выбрать данные из нескольких таблиц...

oleg999 написал:

Пробую так выдает ошибку:
SELECT direction.dirid FROM main m LEFT JOIN direction d ON m.dirid=d.dirname;

Запись direction d сообщает серверу, что вы выбираете данные из таблицы direction, которая отныне назавается d.
При этом вы пишите в начале запроса SELECT direction.dirid
Естественно сервер сообщит вам, что не знает такой таблицы - direction, ведь вы определили её как d.

ON m.dirid=d.dirname
Какой результат вы ожидаете от сравнения поля dirid из таблицы main с полем dirname из таблицы direction?

Неактивен

 

Board footer

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