Verschmelzen Sie zwei komplexe MYSQL-Abfragen - mysql

Ich möchte Hilfe auf einem Weg, zwei komplexe MYSQL-Abfragen zusammenführen.

Abfrage 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

Abfrage 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

Eine kleine Tabellendefinition ist bei gegeben SQL-Geige

Eigentlich ist die erste eine Suchanfrage und dieDie zweite gibt die beliebtesten Ergebnisse basierend auf den Stimmen der letzten 24 Stunden an. Daher möchte ich die Suchanfrage basierend auf der Formel verwenden, die in der zweiten und auch im Zeitbereich verwendet wird

Antworten:

0 für die Antwort № 1

Mit minimalen Änderungen so etwas (wenn ich verstanden habe was du willst)

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

Möglicherweise eine Berührung effizienter zu tauschendie WHERE-Klausel im Subselect (der führende% auf der like wird keinen Index verwenden, daher wahrscheinlich effizienter, um ihn gegen die leicht indizierte Prüfung von post_tags zu setzen))

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