SELECT * FROM (
SELECT qid,via,date,uid, via as cool FROM questions WHERE via != '' AND (uid = 3 OR `uid` IN (SELECT uid_followed FROM followers WHERE uid_follower = 3 AND unfollowed = 0))
AND via NOT IN (SELECT qid FROM votes WHERE uid = 3)
UNION ALL
SELECT qid,via,date,uid, qid as cool FROM questions WHERE via = '' AND (uid = 3 OR `uid` IN (SELECT uid_followed FROM followers WHERE uid_follower = 3 AND unfollowed = 0))
AND qid NOT IN (SELECT qid FROM votes WHERE uid = 3)
) as a
GROUP BY cool
ORDER BY date DESC
这需要 3 秒多的时间,我已将索引放在 qid 和 via 列上的正确列中。 复杂之处在于我想要一个唯一的 qid,并且某些行具有 qid,但实际上是通过 via 字段到其他 qid 的超链接。 并且 qid 中大多数没有 uid = 3 (userID 3) 的投票条目 另外,它必须按时间顺序排序。
最佳答案
试试这个:
SELECT qid,via,date,uid,
case
when via = '' then qid
else via
end as cool
FROM questions
WHERE (via != ''
AND via NOT IN (SELECT qid FROM votes WHERE uid = 3)
OR via = ''
AND qid NOT IN (SELECT qid FROM votes WHERE uid = 3))
AND (uid = 3 OR `uid` IN (SELECT uid_followed FROM followers WHERE uid_follower = 3 AND unfollowed = 0))
ORDER BY date DESC
没有 UNION ALL 和 GROUP BY
告诉我是否可以。我使用 OR 逻辑运算符将两个查询压缩为一个。
您不关心 via 字段的 NULL 值。我使用您的符号(!= '' 或 = ''),但也许您会考虑 NULL 值。
关于mysql - 优化这个mysql查询GROUP BY + ORDER BY + UNION ALL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18698956/