Как уменьшить JOIN в подзапросе? - PullRequest
0 голосов
/ 08 апреля 2019

Вот мой текущий запрос:

SELECT q.type,
      q.author_id author,
      q.deleted,
      q.deleter_id,
      COUNT(DISTINCT a.id) answers_num,
      COUNT(DISTINCT v.id) votes_num,
FROM qanda q
LEFT  JOIN qanda a ON q.id = a.related
LEFT  JOIN votes v on q.id = v.post_id
WHERE q.id = ?

Работает хорошо. Просто мне нужно добавить еще одну вещь (которая возвращает логическое значение EXISTS) в операторе SELECT. Это:

EXISTS (SELECT a.id, sum(vot.value) total_votes
        FROM qanda q
        LEFT JOIN qanda a on q.id = a.related
        LEFT JOIN votes vot ON a.id = vot.post_id
        WHERE q.type = 0         -- this is a question
          AND a.related = 1315   -- getting answers
        GROUP BY a.id
        HAVING total_votes
        ORDER BY total_votes DESC
        LIMIT1
) as HasAUpvotedAnswer

Хорошо, это тоже хорошо работает. Но я беспокоюсь о производительности. Как вы можете видеть, JOIN из этих двух запросов выше (которые будут объединены в конечном итоге) являются одинаковыми. Как сделать их более оптимальными?

Другими словами, как я могу объединить эти два запроса в наиболее оптимальном случае?

1 Ответ

1 голос
/ 08 апреля 2019

В вашем коде может показаться, что вы можете использовать один запрос, используя условную сумму

SELECT q.type,
      q.author_id author,
      q.deleted,
      q.deleter_id,
      COUNT(DISTINCT a.id) answers_num,
      COUNT(DISTINCT v.id) votes_num,
      IF (SUM(
        CASE WHEN q.type  = 0 AND a.related = 1315
          THEN v.value  else  0 END) > 0,1,0) 
      HasAUpvotedAnswer
FROM qanda q
LEFT  JOIN qanda a ON q.id = a.related
LEFT  JOIN votes v on q.id = v.post_id
WHERE q.id = ?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...