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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> необходимо составить очень сложный запрос, left join с "исключением" 
V
    Опции темы
Bulat
Дата 7.11.2008, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 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. вернусь после выходных, отвечу на все дополнительные вопросы.


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
Zloxa
Дата 10.11.2008, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

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



Bulat

Букав много, думал долго, ничего не понял.

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


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Bulat
Дата 11.11.2008, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

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



Zloxa, 

Решение на самом деле довольно сложное, если делать все в одном запросе. В любом случае, задача решена.


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


 




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


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

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