![]() |
|
Модераторы: skyboy |
![]()
|
|
| krinart |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 10.4.2008 Где: Донецк Репутация: нет Всего: нет |
Всем доброго дня. Сначала написал это сообщение в раздел Mysql, но там чтото тихо, решил продублировать сюда.
Есть таблицы
Смысл в том, что есть таблица туры(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, два раза? Например, есть такой запрос
Но мне нужно, чтобы этому параметру соответстовали и остальные отели в этом туре. Я придумал способ, по котому я ВСЕГДА сравниваю два отеля, подставляя для второго в условие по th.hotelOrder количество отелей в туре, то есть либо ещё раз первый, либо, как и требуется, второй
Но понятно, что это не самый оптимальный способ, особенно если учесть, что туров будет хранится несколько миллионов(!). А выбирать сначала первые отели, а потом циклом перебирать все остальные в этому туре - тоже не хочется. Посоветуйте, а? |
||||||
|
|||||||
| Akina |
|
||||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
Переопределённые данные. Удалить.
А это ЗАЧЕМ? при связывании ты получишь в наборе ровно столько записей, сколько отелей связано с туром. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||
|
|||||
| krinart |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 10.4.2008 Где: Донецк Репутация: нет Всего: нет |
Akina, Потому что мне нужно находить информацию не об одном туре, а к примеру, о 10
При обычном связывании я получу не 10 туров, а 10 связок тур-отель. Поэтому мне необходимо сделать так, чтобы каждому туру соответствовала одна строка в результирующем запросе Это поле пока что вспомогательное, пусть будет. Если обойдусь без него - удалю |
|||
|
||||
| Akina |
|
||||||||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
Ну и находи, какие проблемы?
Так и должно быть.
А вот так НЕ должно быть, если их может быть несколько. Следует использовать уровни группировки на стадии отображения результата на клиенте.
То есть использовать гнруппировку и Count религия явно не позволяет... ну и ладно. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||||||
|
|||||||||
| krinart |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 10.4.2008 Где: Донецк Репутация: нет Всего: нет |
Прошу прощение за долгое молчание.
Проблема в том, что сначала мне нужно найти ВСЕ туры, которые попадают под данный критерий, чтобы вывести пользователю сообщение типа "всего найдено Х туров". А потом уже найти LIMIT x,y туров, в зависимости от того, на какой странице пользователь. Так вот как мне ОДНИМ запросом узнать общее количество подходящих туров. Конечно, можна сначала получить туры, где критерию соответствует первый отель, а потом в цикле проверять все оставшиеся отели. Но, как я написал выше, эту операцию придётся проделать дважды, а по-моему это не есть гут.
Если можна подробнее? Единственное, чего мне не позволяет религия, так это не экспериментировать и не искать пути решения, пусть даже заведомо неверные, зато в следующий раз я буду знать, как делать не стоит. |
|||
|
||||
| Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 2 Всего: 42 |
SQL_CALC_FOUND_ROWS в запросе
и второй запрос сразу после него
-------------------- Мир это Я. Живее всех живых. |
|||
|
||||
| krinart |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 10.4.2008 Где: Донецк Репутация: нет Всего: нет |
Fortop, спасибо, вкусная штучка. Обязательно поиграюсь с ней.
Но основной вопрос был в том, как одним запросом проверить соответствие всех отелей, которые соответствуют каждому туру? Учитывая, что это количество может меняться от тура к туру. Вот как это сделать? Как сделать столько связок(и, соответственно, проверок)в запросе, сколько соответствующих полей в таблице tour_hotel? |
|||
|
||||
| Fortop |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 2 Всего: 42 |
Судя по коду в 1м сообщении именно это и делается. В чем вопрос? Как задать в условии несколько разных туров?
Это сообщение отредактировал(а) Fortop - 10.3.2010, 15:42 -------------------- Мир это Я. Живее всех живых. |
||||
|
|||||
| krinart |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 10.4.2008 Где: Донецк Репутация: нет Всего: нет |
Fortop,
В первом сообщении есть два варианта проверки. В первом варианте проверяется только 1 отель на соответствие критерию поиска. Во втором варианте проверяется два, но совсем не красивым способом, хотя по сути и рабочим. А если будет не два, а три отеля, хотя на практике такое врядли будет. Я хочу на будущее узнать, есть ли возможность средствами SQL связывать две таблицы столько раз для проверки данных, сколько всего существует этих связей. И вернуть значение tourID только в том случае, если все записи соответствуют этому критерию |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
Да, есть. Причём можно реализовать не только динамическое изменение количества связываний, но и даже (о ужас! адепты SQL счас перевернутся в гробу) динамическое изменение структуры результата (количества полей). Но было бы гораздо проще, если бы ты не старался всё-таки получать информацию ОДНОЙ ЗАПИСЬЮ. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| krinart |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 10.4.2008 Где: Донецк Репутация: нет Всего: нет |
Akina,
Видимо, хорошо адептам SQL. А вот простым смертным, которые просят совета, и даже предложили свой вариант решения - как-то совсем туго, по крайней мере в этой ветке. Все так и норовят ткнуть ему в то, что он сделал не так. А вот показать, как это сделать следовало бы - адептам SQL, наверное, не с руки. Я уже понял, что поле tours.type явно лишнее, хотя я об этом и подозревал. Но хотелось бы увидеть ещё какой-нибудь вариант решения моей задачи, я думал, для этого и существуют форумы. |
|||
|
||||
| Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 2 Всего: 42 |
не надо заблуждаться http://phpclub.ru/faq/WhyForum
Вы не ответили на мой ответ? На вопросы вполне правильно и корректно ответил Akina А где собственно задача? -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
| Akina |
|
||||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
Просить совета и предложить свой вариант решения - это два взаимоисключающих мероприятия.
Для этого следует как минимум начать всё сначала. Потому как я, например, уже не въезжаю в эту кашу. Например: Так критерий - тура? отеля? обоих сразу? Какие они вообще есть - критерии? Какая она вообще - задача? а не конкретный маленький этапчик?
То есть на самом деле у клиента нет выбора? А вообще что это - отели? Есть тур... селим в первый, кончились места - во второй? или, может, полтура проводим в первом, потом переезжаем во второй? Какая вообще предметная область? над чем работаем? А то леса не видать - одни деревья. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||
|
|||||
| krinart |
|
||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 75 Регистрация: 10.4.2008 Где: Донецк Репутация: нет Всего: нет |
Fortop, я и пытаюсь найти ответ, и поверьте, за время, прошедшее с момента написания первого сообщения, я пробовал применять полученную здесь информацию на практике.
Предметная область - система автоматизации подбора туров для туристического агенства. Конечно, и в таблице tours и в таблице tour_hotel намного больше полей, просто сейчас их можно не рассматривать. Если я разберусь, как сделать поиск по одному из них, мне не составит труда дописать и всё остальное.
Критерий - поле param в таблице tour_hotel. С количеством мест вообще не надо ничего придумывать. В отеле места либо есть, либо нету. Для этого есть отдельное поле в таблице tour_hotel. Но сейчас это не нужно. Представим, что поле param - это количество взрослых в туре. То есть мне нужно найти такие туры, в котором все отели позволяют разместить двух человек. Если я напишу код
То получу просто связки тур-отель, где отель попадает под нужный критерий. Но совсем не обязательно, что так произойдёт со всеми отелями в данном туре. Мне необходимо найти способ, чтобы проверить ровно столько отелей, сколько их в туре. И только в том случае, если все отели попадают под данный критерий - тогда получится, что весь тур попадает под этот критерий. Нет, туры формируются заранее тур-операторами. Точно также, как нельзя установить свои даты туров. Можно лишь выбрать из довольно большого количества уже готовых туров, как я писал в первом сообщении, туров будет порядка 2 миллионов.
Единственная причина, по которой я хотел получать информацию о туре одной строкой - чтобы можно было легко посчитать общее количество туров, подходящих под условия поиска(то есть, чтобы все отели в этом туре подошли под это условие). Но, честно говоря, даже если получать результат несколькими строками - я пока что не знаю, как этого сделать. Всё упирается в сравнение всех отелей в туре с заданным критерием поиска Если максимально упростить вопрос, то он будет звучать примерно так: Есть две таблицы, связанные отношением один-ко-многим. Пусть в первой таблице только одно поле a. Во второй таблице два поля: a и b. Необходимо найти такие a, у которых все значения b попадают под некий критерий. Как это сделать? И как посчитать количество таких строк в таблице a ? |
||||||||
|
|||||||||
| Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 2 Всего: 42 |
А в честь чего все? Это при поиске отдельным чекбоксом устанавливается или как? Откуда такое требование? (впрочем можно и его выполнить) -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Составление SQL-запросов | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |