帮助创建相当复杂的sql语句
大家好,我真的不知道如何用谷歌搜索的形式来描述这一点,所以我决定来这里看看你们是否能帮上忙。基本上,我想知道如何将以下伪sql转换为实际的mysql查询:帮助创建相当复杂的sql语句,sql,mysql,Sql,Mysql,大家好,我真的不知道如何用谷歌搜索的形式来描述这一点,所以我决定来这里看看你们是否能帮上忙。基本上,我想知道如何将以下伪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 po
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).
非常感谢您的帮助。类似这样的内容:
SELECT *
FROM Posts
WHERE Posts.ID NOT IN (
SELECT Votes.PostID FROM Votes WHERE Votes.UserID=@UserID
)
ORDER BY Rand()
LIMIT 1
根据我的经验,联接比subselect快得多,尤其是与NOT in
子句NOT in组合使用时
左连接/左连接为空
不存在
总结
ORDER BY RAND()”
,因为它不会随着数据量的增加而扩展()李>
notin
和LEFT JOIN/IS NULL
在MySQL上是等价的:哇,我不知道。。。我想这是一个主观性的问题:-)。谢谢你指出这一点!对于MS SQL(至少到2005年)通常为true,对于Oracle(至少到10g)通常为false,对于MySQL通常相当;)
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;
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