Как объединить 3 разных запроса SELECT, чтобы их можно было использовать для извлечения 10 значений из 3 разных категорий для вставки в одну временную таблицу? - PullRequest
0 голосов
/ 11 сентября 2018

Существует таблица latest_comments, которая перезаписывается каждые N минут.Содержимое извлекается из таблиц posts и comments и объединяется.Существует 3 различных категории (красный, зеленый, синий), где 10 последних комментариев от каждой категории должны быть представлены в latest_comments.

Без объединения / объединения запрос выглядит так:

INSERT INTO `latest_comments` (`post_id`, `comment_id`, `date`, `comment`, `category`)
SELECT
p.id AS `post_id`,
c.post_id AS `comment_id`,
c.date AS `date`,
c.comment AS `comment`,
p.category AS `category`
FROM `comments` AS c
LEFT JOIN `posts` AS p
ON c.post_id = p.id
WHERE p.category = 'red'
ORDER BY c.date DESC
LIMIT 0, 10;

INSERT INTO `latest_comments` (`post_id`, `comment_id`, `date`, `comment`, `category`)
SELECT
p.id AS `post_id`,
c.post_id AS `comment_id`,
c.date AS `date`,
c.comment AS `comment`,
p.category AS `category`
FROM `comments` AS c
LEFT JOIN `posts` AS p
ON c.post_id = p.id
WHERE p.category = 'green'
ORDER BY c.date DESC
LIMIT 0, 10;

INSERT INTO `latest_comments` (`post_id`, `comment_id`, `date`, `comment`, `category`)
SELECT
p.id AS `post_id`,
c.post_id AS `comment_id`,
c.date AS `date`,
c.comment AS `comment`,
p.category AS `category`
FROM `comments` AS c
LEFT JOIN `posts` AS p
ON c.post_id = p.id
WHERE p.category = 'blue'
ORDER BY c.date DESC
LIMIT 0, 10;

Как объединить все 3 запроса SELECT, чтобы можно было использовать только 1 запрос INSERT, сохраняя при этом его максимально возможную оптимизацию в отношениипроизводительности?

Я перепробовал все, что мог найти, и все, что мог, попытаться придумать свою логику.Ни один из них не сработал, и я думаю, что 3 отдельных запроса INSERT замедляют работу функции.То, что я хотел бы работать, например:

INSERT INTO `latest_comments` (`post_id`, `comment_id`, `date`, `comment`, `category`)
(SELECT
p.id AS `post_id`,
c.post_id AS `comment_id`,
c.date AS `date`,
c.comment AS `comment`,
p.category AS `category`
FROM `comments` AS c
LEFT JOIN `posts` AS p
ON c.post_id = p.id
WHERE p.category = 'red'
ORDER BY c.date DESC
LIMIT 0, 10),

(SELECT
p.id AS `post_id`,
c.post_id AS `comment_id`,
c.date AS `date`,
c.comment AS `comment`,
p.category AS `category`
FROM `comments` AS c
LEFT JOIN `posts` AS p
ON c.post_id = p.id
WHERE p.category = 'green'
ORDER BY c.date DESC
LIMIT 0, 10),

(SELECT
p.id AS `post_id`,
c.post_id AS `comment_id`,
c.date AS `date`,
c.comment AS `comment`,
p.category AS `category`
FROM `comments` AS c
LEFT JOIN `posts` AS p
ON c.post_id = p.id
WHERE p.category = 'blue'
ORDER BY c.date DESC
LIMIT 0, 10);

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Использование UNION ALL :

INSERT INTO `latest_comments` (`post_id`, `comment_id`, `date`, `comment`, `category`)

(SELECT
p.id AS `post_id`,
c.post_id AS `comment_id`,
c.date AS `date`,
c.comment AS `comment`,
p.category AS `category`
FROM `comments` AS c
LEFT JOIN `posts` AS p
ON c.post_id = p.id
WHERE p.category = 'red'
ORDER BY c.date DESC
LIMIT 0, 10)

UNION ALL 

(SELECT
p.id AS `post_id`,
c.post_id AS `comment_id`,
c.date AS `date`,
c.comment AS `comment`,
p.category AS `category`
FROM `comments` AS c
LEFT JOIN `posts` AS p
ON c.post_id = p.id
WHERE p.category = 'green'
ORDER BY c.date DESC
LIMIT 0, 10)

UNION ALL 

(SELECT
p.id AS `post_id`,
c.post_id AS `comment_id`,
c.date AS `date`,
c.comment AS `comment`,
p.category AS `category`
FROM `comments` AS c
LEFT JOIN `posts` AS p
ON c.post_id = p.id
WHERE p.category = 'blue'
ORDER BY c.date DESC
LIMIT 0, 10)
0 голосов
/ 11 сентября 2018

если вы хотите, чтобы 10 строк формировали каждый запрос, вы можете использовать UNION ALL

        INSERT INTO `latest_comments` (`post_id`, `comment_id`, `date`, `comment`, `category`)
        (SELECT
            p.id AS `post_id`,
            c.post_id AS `comment_id`,
            c.date AS `date`,
            c.comment AS `comment`,
            p.category AS `category`
        FROM `comments` AS c
        LEFT JOIN `posts` AS p ON c.post_id = p.id
        WHERE p.category = 'red'
        ORDER BY c.date DESC
        LIMIT 0, 10)
        UNION ALL
        (SELECT
            p.id AS `post_id`,
            c.post_id AS `comment_id`,
            c.date AS `date`,
            c.comment AS `comment`,
            p.category AS `category`
        FROM `comments` AS c
        LEFT JOIN `posts` AS p
        ON c.post_id = p.id WHERE p.category = 'green'
        ORDER BY c.date DESC LIMIT 0, 10 )
        UNION ALL
        (SELECT
            p.id AS `post_id`,
            c.post_id AS `comment_id`,
            c.date AS `date`,
            c.comment AS `comment`,
            p.category AS `category`
        FROM `comments` AS c
        LEFT JOIN `posts` AS p
        ON c.post_id = p.id WHERE p.category = 'blue'
        ORDER BY c.date DESC LIMIT 0, 10)

В любом случае, вы используете столбец таблицы левого соединения WHERE p.category = 'blue', в котором, где это предложение работает как внутреннее соединение

        INSERT INTO `latest_comments` (`post_id`, `comment_id`, `date`, `comment`, `category`)
        (SELECT
            p.id AS `post_id`,
            c.post_id AS `comment_id`,
            c.date AS `date`,
            c.comment AS `comment`,
            p.category AS `category`
        FROM `comments` AS c
        INNER JOIN `posts` AS p ON c.post_id = p.id and p.category = 'red'
        ORDER BY c.date DESC
        LIMIT 0, 10)

        UNION ALL
        (SELECT
            p.id AS `post_id`,
            c.post_id AS `comment_id`,
            c.date AS `date`,
            c.comment AS `comment`,
            p.category AS `category`
        FROM `comments` AS c
        INNER JOIN `posts` AS p ON c.post_id = p.id AND p.category = 'green'
        ORDER BY c.date DESC LIMIT 0, 10)
        UNION ALL
        (SELECT
            p.id AS `post_id`,
            c.post_id AS `comment_id`,
            c.date AS `date`,
            c.comment AS `comment`,
            p.category AS `category`
        FROM `comments` AS c
        INNER JOIN `posts` AS p ON c.post_id = p.id AND p.category = 'blue'
        ORDER BY c.date DESC LIMIT 0, 10);

или если вам просто нужно 30 строк, вы можете использовать предложение IN

        INSERT INTO `latest_comments` (`post_id`, `comment_id`, `date`, `comment`, `category`)
        SELECT
            p.id AS `post_id`,
            c.post_id AS `comment_id`,
            c.date AS `date`,
            c.comment AS `comment`,
            p.category AS `category`
        FROM `comments` AS c
        INNER JOIN `posts` AS p ON c.post_id = p.id and p.category IN ( 'red', 'green', 'blue')
        ORDER BY c.date DESC
        LIMIT 0, 30;
...