嘿大家,我不太确定如何以谷歌搜索的形式描述这个,所以我决定来这里看看你们是否可以提供帮助。基本上,我想知道如何将以下伪sql转换为实际的mysql查询:
Select one random row
from `posts`
where (the user's id, which is supplied by the script) is not found in the `votes` table
with a post id of (the selected post's id).
如果你能提供帮助,非常感谢你。
答案 0 :(得分:6)
这样的事情:
SELECT *
FROM Posts
WHERE Posts.ID NOT IN (
SELECT Votes.PostID FROM Votes WHERE Votes.UserID=@UserID
)
ORDER BY Rand()
LIMIT 1
答案 1 :(得分:1)
SELECT p.*
FROM `posts`
LEFT JOIN `votes` ON (posts.post_id=votes.post_id AND votes.user_id=@UserID)
WHERE votes.user_id is null
ORDER BY rand()
LIMIT 1;
根据我的经验,连接明显快于子选择,特别是与NOT IN
子句结合使用
答案 2 :(得分:1)
SELECT p.*,
FLOOR(1 + RAND() * x.m_id) 'rand_ind'
FROM POSTS p
JOIN (SELECT MAX(t.id) - 1 'm_id'
FROM POSTS t) x
WHERE p.id NOT IN (SELECT v.postid
FROM VOTES v
WHERE v.userid = @UserID)
ORDER BY rand_ind
LIMIT 1
SELECT p.*,
FLOOR(1 + RAND() * x.m_id) 'rand_ind'
FROM POSTS p
JOIN (SELECT MAX(t.id) - 1 'm_id'
FROM POSTS t) x
LEFT JOIN VOTES v ON v.postid = p.id
AND v.userid = @UserID
WHERE v.postid IS NULL
ORDER BY rand_ind
LIMIT 1
SELECT p.*,
FLOOR(1 + RAND() * x.m_id) 'rand_ind'
FROM POSTS p
JOIN (SELECT MAX(t.id) - 1 'm_id'
FROM POSTS t) x
WHERE NOT EXISTS(SELECT NULL
FROM VOTES v
WHERE v.userid = @UserID
AND v.post_id = p.id)
ORDER BY rand_ind
LIMIT 1
LEFT JOIN/IS NULL
and NOT IN
are equally efficient; NOT EXISTS
is less efficient。ORDER BY RAND()
,因为它不会随着数据量的增加而缩放(graph)。 Related question。