Ограничить общее количество результатов по таблицам - PullRequest
1 голос
/ 14 апреля 2020

Я хочу получить последние 100 событий, которые произошли. События разбросаны по нескольким таблицам. Вот пример:

SELECT * FROM log_items_purchased ORDER BY timestamp DESC LIMIT 100
UNION
SELECT * FROM log_items_fulfilled ORDER BY timestamp DESC LIMIT 100
UNION
SELECT * FROM log_items_shipped ORDER BY timestamp DESC LIMIT 100

Это вернет до 300 записей. Затем я бы взял набор результатов, упорядочил по метке времени и взял бы первые 100 записей. Как я могу выполнить это в одном запросе SQL, где SQL будет возвращать только 100 записей в наборе результатов.

Я понимаю, что это можно сделать, удалив LIMIT 100 из каждого запрос, а затем сделать внешний запрос, который добавляет LIMIT 100, но эти таблицы действительно большие, и это действительно неэффективно.

Ответы [ 3 ]

2 голосов
/ 14 апреля 2020

Поместите его в подзапрос, затем используйте LIMIT 100 в основном запросе.

SELECT *
FROM (
    SELECT * FROM log_items_purchased ORDER BY timestamp DESC LIMIT 100
    UNION
    SELECT * FROM log_items_fulfilled ORDER BY timestamp DESC LIMIT 100
    UNION
    SELECT * FROM log_items_shipped ORDER BY timestamp DESC LIMIT 100
) AS x
ORDER BY timestamp DESC
LIMIT 100
1 голос
/ 14 апреля 2020

Если вы хотите сделать это в SQL, используйте подзапрос:

SELECT e.*
FROM ((SELECT * FROM log_items_purchased ORDER BY timestamp DESC LIMIT 100
      ) UNION ALL
      (SELECT * FROM log_items_fulfilled ORDER BY timestamp DESC LIMIT 100
      ) UNION ALL
      (SELECT * FROM log_items_shipped ORDER BY timestamp DESC LIMIT 100
      )
     ) e
ORDER BY timestamp DESC
LIMIT 100;

Примечание. Не используйте UNION. Это приводит к накладным расходам на удаление дубликатов.

0 голосов
/ 14 апреля 2020

Я думаю, что это будет работать

(SELECT * FROM log_items_purchased ORDER BY timestamp DESC LIMIT 100)
UNION
(SELECT * FROM log_items_fulfilled ORDER BY timestamp DESC LIMIT 100)
UNION
(SELECT * FROM log_items_shipped ORDER BY timestamp DESC LIMIT 100)
ORDER BY timestamp DESC LIMIT 100
...