![]() |
|
Модераторы: skyboy |
![]()
|
|
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: нет Всего: 57 |
Поясню условия задачи: есть так сказать развлекательный комплекс, в котором по одному билету можно сходить на разные киносеансы.
table1: (Дадим так сказать смысловой алиас, таблица статистики. По каким билетам на какие фильмы ходили) field_1_1 - ид билета field_1_2 - ид сеанса field_4 - столбец с информацией любого рода, не ключ table2: (Статистика соотношений, т.е. по каким билетам на какие сеансы можно ходить) field_2_1 - ид билета field_2_2 - ид сеанса filed_3 - ид, определяющий фильм ужасов = 0, комедию =1 и т.п., не ключ field_4 - столбец с информацией любого рода, не ключ связь table1.field_1_1 = table2.field_2_1 и table1.field_1_2 = table2.field_2_2 примечание, связь сразу по двум полям, дает нам один к одному в то время как связь лишь по одному из полей, дает нам многие ко многим. т.е. table1: table2: ____________________ _ _________________________ | field_1_1 | field_1_2 | | field_2_1 | field_2_2 | field_3 | | 1 | -1 | | 1 | -1 | 0 | | 1 | -2 | | 1 | -2 | 1 | | 2 | -3 | | 2 | -3 | 0 | | 3 | -4 | | 3 | -4 | 2 | | 3 | -1 | | 3 | -1 | 0 | | 3 | -5 | | 3 | -5 | 0 | |_________|_________| | 3 | -6 | 0 | |________|_________|_______| Важно: в таблице table1 может не присутствовать запись по группе ключей, которая есть в таблице table2 (последняя строка в таблице table2) что касается поля field_3 оно не является ключом, связующим таблицы. однако для каждой группы полей field_2_1 и field_2_2 оно уникально, или если еще проще UNIQUE KEY `group_1` (field_2_1, field_2_2, field_3) есть еще и третья таблица table3: field_3_2 (список фильмов-сеансов) field_5 - столбец с информацией любого рода, не ключ Я думаю по аналогии понятно, что связываются таблицы table1.field_1_2 = table3.field_3_2 или table2.field_2_2 = table3.field_3_2 При этом table3.field_3_2 праймари, т.е. связь один ко многим Соотв. в этих таблицах присутствуют и другие столбцы, но несут информационный характер Само условие, нужно из таблицы статистики, получить данные заджойнить к нему таблицу соотношений по двум ключям, взять данные из таблицы соотношений и сгруппировать по билетам и получить названия фильмов. Соотв. из-за названий фильмов нам и нужна таблица table3 Здесь все довольно просто SELECT ... FROM table1 LEFT JOIN table2 ON table1.field_1_1 = table2.field_2_1 AND table1.field_1_2 = table2.field_2_2 LEFT JOIN table3 ON table2.field_2_2 = table3.field_2_3 ... GROUP BY table1.field_1_1 Таким образом мы получаем некую общую таблицу статистики о том, какие фильмы были посещены, по конкретным билетам + левые данные. Теперь же появилась новая необходимость. Грубо говоря, нужно обособить все фильмы ужасов, т.е. table2.field_3 = 0, по билетам. Т.е. нам необходимо еще раз приджойнить таблицу table2 к таблице table1, только в отличии от LEFT JOIN table2 ON table1.field_1_1 = table2.field_2_1 AND table1.field_1_2 = table2.field_2_2 нам нужно получить все записи из таблицы table2, у которых table2.field_3 = 0 AND table1.field_1_1 = table2.field_2_1 при этом нужно исключить те строки, в которых table1.field_1_2 = table2.field_2_2. Т.е. если смотреть по таблицам нарисованным выше мне необходимо для любого table1.field_1_1 = 3 получить все table2.field_2_2, у которых table2.field_3 = 0, т.е. table2.field_2_2 = -1, table2.field_2_2 = -5, table2.field_2_2 = -6, исключить table2.field_2_2 = -1, table2.field_2_2 = -5 так как они уже были задействованы при предыдущем джойне SELECT ... FROM table1 LEFT JOIN table2 ON table1.field_1_1 = table2.field_2_1 AND table1.field_1_2 = table2.field_2_2 LEFT JOIN table3 ON table2.field_2_2 = table3.field_2_3 ... GROUP BY table1.field_1_1 Или если будет угодно, исключить то, что уже было получено при вышеуказанном джойне, получив лишь те строки, которые "не были задействованы ранее" и у которых table2.field_3 = 0. Есс-но, потом из таблицы table3 получить все field5, с помощью group_concat Фу-ух, задача не простая, если все же остались вопросы, задавайте. И хотелось бы, чтоб запрос все же работал как можно быстрее P.S. вернусь после выходных, отвечу на все дополнительные вопросы. -------------------- менеджер по кодеврайтингу |
|||
|
||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 33 Всего: 161 |
Bulat
Букав много, думал долго, ничего не понял. Думаю, если вы приведете тест-данные таблицы 3 и пример ожидаемого результата, решение окажется не столь сложным, сколь вы ожидаете. -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: нет Всего: 57 |
Zloxa,
Решение на самом деле довольно сложное, если делать все в одном запросе. В любом случае, задача решена. -------------------- менеджер по кодеврайтингу |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MySQL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |