Об'єднати два складні запити MYSQL - mysql

Я хочу допомогти, щоб об'єднати два складних запити MYSQL.

Запит 1:

SELECT  p.*
FROM    posts p
INNER JOIN
(
SELECT  a.ID
FROM    posts a
INNER JOIN post_tags b
ON a.ID = b.post_ID
WHERE   a.post LIKE "%mmmm%" AND
b.tagname IN ("#test","#iseeyou")
GROUP   BY ID
HAVING  COUNT(DISTINCT b.tagname) = 2
) sub ON p.ID = sub.ID
ORDER   BY p.upvotes DESC, p.unix_timestamp DESC

Запит 2:

SELECT p.*, ((upvotes + 1.9208) / (upvotes + downvotes) - 1.96 * SQRT((upvotes * downvotes)
/ (upvotes + downvotes) + 0.9604) / (upvotes + downvotes))
/ (1 + 3.8416 / (upvotes + downvotes)) AS ci_lower_bound
FROM posts p WHERE upvotes + downvotes > 0
AND p.unix_timestamp BETWEEN 1363023402 AND 1363109802 ORDER BY ci_lower_bound DESC

Невелике визначення таблиці наведено на SQL Fiddle

Насправді, перший - це пошуковий запит ідругий дає найпопулярніші результати на основі голосів за останні 24 години, тому я хочу використовувати пошуковий запит на основі формули, використаної у другому, а також діапазоні часу

Відповіді:

0 для відповіді № 1

З мінімальними змінами щось на зразок цього (якщо я зрозумів, що ви хочете правильно)

SELECT  p.*, ((upvotes + 1.9208) / (upvotes + downvotes) - 1.96 * SQRT((upvotes * downvotes)
/ (upvotes + downvotes) + 0.9604) / (upvotes + downvotes))
/ (1 + 3.8416 / (upvotes + downvotes)) AS ci_lower_bound
FROM    posts p
INNER JOIN
(
SELECT  a.ID
FROM    posts a INNER JOIN post_tags b  ON a.ID = b.post_ID
WHERE   a.post LIKE "%mmmm%" AND b.tagname IN ("#test","#iseeyou")
GROUP   BY ID
HAVING  COUNT(DISTINCT b.tagname) = 2
) sub ON p.ID = sub.ID
WHERE upvotes + downvotes > 0
AND p.unix_timestamp BETWEEN 1363023402 AND 1363109802
ORDER BY ci_lower_bound DESC

Можливо, дотик більш ефективний для обмінупропозиція WHERE про subselect (провідна% у подібному не буде використовувати індекс, отже, ймовірно, більш ефективно приєднати його до легко індексованої перевірки на post_tags))

SELECT  p.*, ((upvotes + 1.9208) / (upvotes + downvotes) - 1.96 * SQRT((upvotes * downvotes)
/ (upvotes + downvotes) + 0.9604) / (upvotes + downvotes))
/ (1 + 3.8416 / (upvotes + downvotes)) AS ci_lower_bound
FROM    posts p
INNER JOIN
(
SELECT  a.ID
FROM    post_tags b STRAIGHT_JOIN posts a ON a.ID = b.post_ID
WHERE   a.post LIKE "%mmmm%" AND b.tagname IN ("#test","#iseeyou")
GROUP   BY ID
HAVING  COUNT(DISTINCT b.tagname) = 2
) sub ON p.ID = sub.ID
WHERE upvotes + downvotes > 0
AND p.unix_timestamp BETWEEN 1363023402 AND 1363109802
ORDER BY ci_lower_bound DESC

Схожі запитання
Найбільш популярний