Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Связывание двух таблиц по надобности 
:(
    Опции темы
krinart
Дата 4.3.2010, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 10.4.2008
Где: Донецк

Репутация: нет
Всего: нет



Всем доброго дня.
Есть проблема, которую хотелось бы решить.

Есть такие таблицы
Код

CREATE TABLE `tours` (
`tourID` bigint( 20 ) unsigned NOT NULL AUTO_INCREMENT ,
`type` tinyint( 3 ) unsigned NOT NULL,
PRIMARY KEY ( `tourID` ) ,
)

CREATE TABLE .`tour_hotel` (
`tour_hotel_ID` bigint( 20 ) unsigned NOT NULL AUTO_INCREMENT ,
`tourID` bigint( 20 ) unsigned NOT NULL ,
`hotelID` bigint( 20 ) unsigned NOT NULL ,
`hotelOrder` tinyint( 3 ) unsigned NOT NULL ,
`param` varchar( 17 ) COLLATE utf8_unicode_ci NOT NULL ,
PRIMARY KEY ( `tour_hotel_ID` ) ,



Смысл в том, что есть таблица туры(tours), в которой хранится информация о турах(даты, цена и т.д.), есть таблица tour_hotel, в которой связываются туры и отели, в которых проживают люди. Это сделано для того, чтобы с одним туром могло быть связано несколько отелей. В таблице tours есть поле type, в котором хранится количесто отелей, связанных с этим туром, на практике оно бывает равно либо 1, либо 2. Поле hotelOrder показывает, в каком порядке происходит проживание в отелях в каждом туре(1, 2 и т.д.). В таблице tour_hotel есть информация о проживании в отеле, для примера я сделал одно поле param.

Например, это может выглядеть так

tours
|----------|---------|
| tourID |   type  |
|----------|---------|
|      1     |     2     |
|----------|---------|
то есть у тура 2 отеля


tour_hotel
|--------------------|-----------|--------------|--------------------|----------------|
| tour_hotel_ID |   tourID |   hotelID  |    hotelOrder    |    param     |
|--------------------|-----------|--------------|--------------------|----------------|
|             1           |       1      |        10      |            1            |        123      |
|--------------------|-----------|--------------|--------------------|----------------|
|             2           |       1      |        20      |            2            |         123     |
|--------------------|-----------|--------------|--------------------|----------------|
соответсвенно, с первым туром связаны два отеля, у которых указана очередность  проживания и некий параметр


Таблицу hotels не привожу, так как в её структуре ничего интересного нет.

Теперь, собственно, вопрос. Как мне сделать связывание таблицы tours с таблицей tour_hotel, если hotel.type=2, два раза?

Например, есть такой запрос
Код

SELECT * FROM tours t INNER JOIN tour_hotel th ON t.tourID=th.tourID
WHERE th.hotelOrder=1 AND th.param=123



Но мне нужно, чтобы этому параметру соответстовали и остальные отели в этом туре. Я придумал способ, по котому я ВСЕГДА сравниваю два отеля, подставляя для второго в условие по th.hotelOrder количество отелей в туре, то есть либо ещё раз первый, либо, как и требуется, второй
Код

SELECT * FROM (tours t INNER JOIN tour_hotel th1 ON t.tourID=th1.tourID) INNER JOIN tour_hotel th2 ON t.tourID=th2.tourID
WHERE th1.hotelOrder=1 AND th2.hotelOrder=t.type AND th1.param=123  AND th2.param=123 


Но и ежу понятно, что это не самый оптимальный способ, особенно если учесть, что туров будет хранится несколько миллионов(!). А выбирать сначала первые отели, а потом циклом перебирать все остальные в этому туре - тоже не хочется. Посоветуйте, а?






PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0856 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.