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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Лучший способ выборки из нескольких таблиц, по одному общему полю 
V
    Опции темы
Рыжий
Дата 25.1.2011, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Помешанный
***


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

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



Добрый вечер!
На сайте, пользователь может добавлять 3 вида контента: посты, ссылки, комментарии.
соответственно есть 3 таблицы:
1) Посты
2) Ссылки
3) Комментарии

В каждой есть поле user_id - в нем храннится user id (о как!) и time, в ней время)

Вопрос:
Как можно выбрать 10 последних update`ов пользователя? Из всех таблиц одновременно?  К примеру:
1. ссылка (1мин назад)
2. пост (5мин назад)
3. пост (20мин назад)
4. комментарий (40мин назад)
...



Я вижу 3 метода решения проблемы:
1) Какой-то хитрый SQL запрос, который я никак сформулировать не могу)) (UNION использовать нельзя т.к. кол-во полей во всех таблицах разное)

2) Создать другую таблицу 'updates' в которую просто в хронологическом порядке записывать все обновления со ссылками на другие таблицы, типа:
id | user_id | update_id | time
0         2              52          123456...
1         2              80          13456.

3) (отчаянный) - выбирать с десяток последних записей с каждой таблицы, помещать результаты в массив и оперировать массивом (это на крайний случай, но 100% рабочий)


Поделитесь советом, кто имел дело с чем нибудь подобным?

Это сообщение отредактировал(а) Рыжий - 25.1.2011, 00:04
PM MAIL ICQ   Вверх
Akina
Дата 25.1.2011, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


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

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



Цитата(Рыжий @  25.1.2011,  01:02 Найти цитируемый пост)
UNION использовать нельзя т.к. кол-во полей во всех таблицах разное

А нефиг звёздочки лепить! указывай конкретный список совместимых требуемых полей - и будет тебе щастье.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Рыжий
Дата 25.1.2011, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Помешанный
***


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

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



Akina, неа, если было бы так просто =)
В таблице ссылки у меня 4 поля, в таблице посты ~15 (там кроме поста вводится еще информация)
PM MAIL ICQ   Вверх
Akina
Дата 25.1.2011, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


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

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



Ну и что? тоже мне проблема...

Код

select q.* 
from
(
 (
  select t1.dt, t1.fld11, t1.fld12, ..., t1.fld1N1, -1 as fld21, '' as fld22, ... -1 as fld3N3
  from table1 as t1
  order by t1.dt desc
  limit 10
 )
union all
 (
  select t2.dt, -1, '', ..., -1, t2.fld21, t2.fld22, ..., t2.fld2N2, -1 as fld31, '' as fld32, ... -1 as fld3N3
  from table2 as t2
  order by t2.dt desc
  limit 10
 )
union all
 (
  select t3.dt, -1, '', ..., -1, t3.fld31, t3.fld32, ..., t3.fld3N3
  from table3 as t3
  order by t3.dt desc
  limit 10
 )
) as q
order by q.dt desc
limit 10


Это сообщение отредактировал(а) Akina - 25.1.2011, 14:00


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Рыжий
Дата 25.1.2011, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Помешанный
***


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

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



Akina, Да, огромное спасибо, это сработает smile 
PM MAIL ICQ   Вверх
Akina
Дата 25.1.2011, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


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

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



Рыжий, Обрати внимание на скобки. Их куча, но их наличие - КРИТИЧНО.
Подробности в документации по UNION.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 26.1.2011, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

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



+ индекс по паре (пользователь,дата модификации) 
+ not null на дату модификации, чтобы мог использоваться индекс для сортировки.

При этих условиях решение, по идее, на объемах должно бы хорошо себя вести. Однако что-то меня таки постремывает малость. Я бы, пожалуй, склонился к варианту 2) ТС.

Это сообщение отредактировал(а) Zloxa - 26.1.2011, 09:52


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


 




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


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

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