Получение 25 последних добавленных записей из всех таблиц в базе данных MySQL - PullRequest
0 голосов
/ 31 октября 2009

У меня есть база данных MySQL (названная "sitefeather"), в которой в конечном итоге будет несколько таблиц с одинаковой структурой. Структура такая:

id INT(11) NOT NULL auto_increment, site VARCHAR(1000) NOT NULL, action1 BIGINT(9) NOT NULL, action2 BIGINT(9) NOT NULL, createddatetime TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY(id), UNIQUE (site)

Я хотел бы напечатать список 25 самых последних добавленных записей (называемых «сайт» в каждой таблице) во всех таблицах. Как я могу сделать это с PHP?

Заранее спасибо,

John

РЕДАКТИРОВАТЬ: Как бы я сделал это для ряда таблиц, которые будут переменными?

Ответы [ 3 ]

3 голосов
/ 31 октября 2009

Вы хотите сделать что-то вроде:

(
    select 't' as table_name, id, createdatetime 
    from t 
    order by createdatetime desc 
    limit 25
)
union
(
    select 'u' as table_name, id, createdatetime 
    from u 
    order by createdatetime desc 
    limit 25
)
union
(
    select 'v' as table_name, id, createdatetime 
    from v 
    order by createdatetime desc 
    limit 25
)
order by createdatetime desc
limit 25

Это должно гарантировать вам преимущество любого индекса, имеющегося у вас в поле createdatetime различных таблиц, и позволит вам определить, из какой таблицы был выбран каждый из 25 полученных идентификаторов.

2 голосов
/ 31 октября 2009

С http://dev.mysql.com/doc/refman/5.0/en/union.html

(SELECT id FROM table1)
  UNION ALL
(SELECT id FROM table2)
  UNION ALL
(SELECT id FROM table3)
  UNION ALL
(SELECT id FROM tableN)
  ORDER BY createdatetime DESC 
  LIMIT 25

Вы действительно захотите посмотреть индексы для оптимизации здесь ...

1 голос
/ 31 октября 2009

Если вы собираетесь делать это или запрашивать все таблицы одновременно по другой причине, очень часто вам может понадобиться настроить таблицу MERGE , которая обеспечивает более легкий доступ к объединенным данным.

CREATE TABLE merged_table (
    id INT(11) NOT NULL auto_increment,
    site VARCHAR(1000) NOT NULL,
    action1 BIGINT(9) NOT NULL,
    action2 BIGINT(9) NOT NULL,
    createddatetime TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY(id),
    UNIQUE (site)) ENGINE=MERGE UNION=(table1,table2,table3,tableN) INSERT_METHOD=LAST;

Однако этот метод эффективен, только если вы будете каждый раз запрашивать одни и те же таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...