2
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) の投票にほとんどエントリがありません。さらに、年代順にソートする必要があります。

4

1 に答える 1

2

これを試して:

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 論理演算子を使用して、2 つのクエリを 1 つにまとめます。

via フィールドの NULL 値は気にしません。私はあなたの表記 (!= '' または = '') を使用しますが、おそらく NULL 値を考慮するでしょう。

于 2013-09-09T13:17:57.687 に答える