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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MySQL склеивание несольких записей 
:(
    Опции темы
Гость
Дата 23.12.2003, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Извините по поводу названия темы, не пришло ничего более умного в голову... thumbs-up.gif

Вопрос такой:
есть таблица

movie_id | action | date

в ней хранятся записи о фильмах взятых на прокат или возвращённых..

action = 1 фильм взяли на прокат
action = 2 фильм вернули

одним запросом нужно выбрать все фильмы которые вернули, вместе с датой когда его взяли и датой когда его вернули

movie_id | lease_date | return_date


PM MAIL   Вверх
shilnik
Дата 24.12.2003, 06:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Попробуй так (сам не пробовал):

Select a.movie_id, a.Date as lease_date, b.Date as return_date
From table a inner join table b on (a.movie_id=b.movie_id)
Where a.action = 1 and b.action = 2



--------------------
каталог товаров qp1
PM MAIL WWW   Вверх
Гость
Дата 24.12.2003, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я сделал так:
Select a.id AS aid, a.movie_id, a.date as lease_date, b.date as return_date, b.id as bid FROM actions AS a INNER JOIN actions AS b on ( a.movie_id = b.movie_id) WHERE a.action = 1 and b.action = 2 ORDER BY a.movie_id

получилось так

aid |--------------------------------------------------------------------| bid
753 | 3202 | 2003-12-24 10:23:14 | 2003-12-11 16:22:05 | 816 |
812 | 3202 | 2003-12-11 16:20:00 | 2003-12-11 16:22:05 | 816 |
753 | 3202 | 2003-12-24 10:23:14 | 2003-12-24 10:23:51 | 759 |
812 | 3202 | 2003-12-11 16:20:00 | 2003-12-24 10:23:51 | 759 |

а верный результат

753 | 3202 | 2003-12-24 10:23:14 | 2003-12-24 10:23:51 | 759 |
812 | 3202 | 2003-12-11 16:20:00 | 2003-12-11 16:22:05 | 816 |
PM MAIL   Вверх
AntonSaburov
Дата 24.12.2003, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Не проще ли было делать два поля - отдали, приняли.

Просто при указанной структуре сделать требуемое очень сложно. Как я понимаю фильм может браться и возвращаться несколько раз. И определить, для какой сдачи в аренду какая запись о приеме соответствует крайне неприятная задача.

Надо вычислять даты по порядку, вообщем крайне неприятная задачка.

Лучше всего исправить структуру таблицы

PM MAIL WWW ICQ   Вверх
Гость
Дата 6.1.2004, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



На самом деле action может иметь примерно 6-7 значений.
PM MAIL   Вверх
Secandr
Дата 6.1.2004, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

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



SQL
SELECT
t1.movie_id as "movie_id",
t1.date as "return_date",
t2.date as "lease_date"
FROM `actions` `t1` LEFT JOIN `actions` `t2` ON (t1.movie_id=t2.movie_id)
WHERE t1.action='вернули' and t2.action='взяли'
GROUP BY t1.movie_id

Запрос вернёт тебе все фильмы которые вернули.
P.S. Смысл в том, что inner join склеивает две таблицы так, что там оказываются всё что брали и всё что возвращали. left join найдёт все вернувшиеся и прибавит к ним дату изъятия если такая существует.

Это сообщение отредактировал(а) Secandr - 6.1.2004, 11:37


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


 




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


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

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