mysql - 优化这个mysql查询GROUP BY + ORDER BY + UNION ALL

标签 mysql

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/

相关文章:

php - Zend Framework 和 Cubique 网格 - LEFT OUTER JOIN

mysql - NodeJS不会使用node-mysql连接到本地数据库

mysql - 从R中的mysql(使用for循环(?))选择数据

php - 以base64格式对图像进行编码并存储在mysql数据库中,不适用于php和laravel的所有类型的图像

mysql - 如何在 MySql 中获取 2.5m 行的最后一条记录

php - 显示和删除数据库中的数据

php - 根据 POST 参数创建更新查询

php - 在数据库中计算相等值的最佳做法是什么?

java - 如何从 Hibernate 上的外键引用的表中获取值?

mysql - 如何使用mysql以 "February, Seventeenth 2016"之类的字样显示日期