как объединить два запроса в laravel

avatar
Neena
9 августа 2021 в 05:19
128
2
1

У меня есть 3 таблицы:

  • tb_user
  • tb_addquestion
  • tb_answer

Следующие запросы возвращают количество вопросов на пользователя (query 1) и ответов на пользователя (query 2). Мне нужно объединить результаты в один вывод.

Как этого добиться с помощью одного запроса?

Количество вопросов на пользователя (запрос1)

SELECT tb_addquestion.userid,
       COUNT(*) AS count
FROM tb_addquestion
LEFT JOIN tb_user
    ON tb_user.userid = tb_addquestion.userid
GROUP BY tb_addquestion.userid
HAVING count > 0 AND
       count < 15 

Ответов на пользователя (запрос2)

SELECT tb_answer.userid,
       COUNT(*) AS count
FROM tb_answer
LEFT JOIN tb_user
    ON tb_user.userid = tb_answer.userid
GROUP BY tb_answer.userid
HAVING count > 0 AND
       count < 15 
Источник
matiaslauriti
9 августа 2021 в 05:29
0

Извините, в чем проблема с запуском 2 отдельных запросов? Если вы объедините их, они все равно будут выполняться как 2 запроса (если вы можете их объединить).

AbsoluteBeginner
9 августа 2021 в 06:03
0

@matiaslauriti Вы уверены, что нет разницы (с точки зрения производительности) между двумя отдельными запросами (= два запроса к БД) и одним комбинированным запросом (= один запрос к БД)?

matiaslauriti
9 августа 2021 в 06:11
0

@AbsoluteBeginner Производительность БД была бы такой же, или объединение их в одном запросе было бы худшим ...

Ответы (2)

avatar
shaedrich
9 августа 2021 в 07:16
1

Вы можете использовать UNION:

SELECT tb_addquestion.userid,
       COUNT(*) AS count,
       'questions' AS type
FROM tb_addquestion
LEFT JOIN tb_user
    ON tb_user.userid = tb_addquestion.userid
GROUP BY tb_addquestion.userid
HAVING count > 0 AND
       count < 15 

UNION

SELECT tb_answer.userid,
       COUNT(*) AS count,
       'answers' AS type
FROM tb_answer
LEFT JOIN tb_user
    ON tb_user.userid = tb_answer.userid
GROUP BY tb_answer.userid
HAVING count > 0 AND
       count < 15 
avatar
Tim Biegeleisen
9 августа 2021 в 05:37
1

Обычно мы выполняли агрегирование в отдельных подзапросах, а затем присоединяли основную таблицу к каждому из этих подзапросов:

SELECT
    u.userid,
    COALESCE(aq.q_cnt, 0) AS q_cnt,
    COALESCE(a.a_cnt, 0) AS a_cnt
FROM tb_user u
LEFT JOIN
(
    SELECT userid, COUNT(*) AS q_cnt
    FROM tb_addquestion
    GROUP BY userid
    HAVING q_cnt > 0 AND q_cnt < 15
) aq
    ON aq.userid = u.userid
LEFT JOIN
(
    SELECT userid, COUNT(*) AS a_cnt
    FROM tb_answer
    GROUP BY userid
    HAVING a_cnt > 0 AND a_cnt < 15
) a
    ON a.userid = u.userid