帮助创建相当复杂的sql语句

帮助创建相当复杂的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

大家好,我真的不知道如何用谷歌搜索的形式来描述这一点,所以我决定来这里看看你们是否能帮上忙。基本上,我想知道如何将以下伪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).
非常感谢您的帮助。

类似这样的内容:

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