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

时间:2010-01-27 21:53:22

标签: 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 post's id).

如果你能提供帮助,非常感谢你。

3 个答案:

答案 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

LEFT JOIN / IS NULL


   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

NOT EXISTS


  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

摘要


  1. LEFT JOIN/IS NULL and NOT IN are equally efficient; NOT EXISTS is less efficient
  2. 建议不要
  3. ORDER BY RAND(),因为它不会随着数据量的增加而缩放(graph)。 Related question
相关问题