代码之家  ›  专栏  ›  技术社区  ›  rxmnnxfpvg

SQL查询至少有一个

  •  11
  • rxmnnxfpvg  · 技术社区  · 14 年前

    架构:

    Users: id
    Posts: user_id, rating
    

    我如何找到所有用户谁至少有一个评分以上的职位,比如说,10?

    我不确定是否应该对此使用子查询,或者是否有更简单的方法。

    谢谢!

    6 回复  |  直到 14 年前
        1
  •  30
  •   OMG Ponies    14 年前

    要查找至少有一篇文章评分高于10的所有用户,请使用:

    SELECT u.*
      FROM USERS u
     WHERE EXISTS(SELECT NULL
                    FROM POSTS p
                   WHERE p.user_id = u.id
                     AND p.rating > 10)
    

    EXISTS不关心其中的SELECT语句-可以用1/0替换NULL,这将导致除以0的数学错误。。。但它不会,因为EXISTS只关心WHERE子句中的过滤。

    相关性(其中p.user\u id=u.id)就是为什么称之为相关子查询的原因,除了评级比较之外,它只返回id值匹配的USERS表中的行。

    EXISTS的速度也更快,这取决于具体情况,因为一旦满足条件,它就会返回true—重复并不重要。

        2
  •  2
  •   Ike Walker    14 年前

    您可以联接表以查找相关用户,并使用DISTINCT,这样每个用户最多只能在结果集中出现一次,即使他们有多篇评级为>的文章;10:

    select distinct u.id,u.username
    from users u inner join posts p on u.id = p.user_id 
    where p.rating > 10
    
        3
  •  1
  •   Jon Weers    14 年前

    SELECT * from users INNER JOIN posts p on users.id = p.user_id where p.rating > 10;
    
        4
  •  1
  •   xagyg    14 年前
    select distinct id
    from users, posts
    where id = user_id and rating > 10
    
        5
  •  0
  •   OMG Ponies    14 年前
    SELECT max(p.rating), u.id 
      from users u 
    INNER JOIN posts p on users.id = p.user_id 
    where p.rating > 10 
    group by u.id;
    

    此外,这将告诉你他们的最高评级是什么。

        6
  •  0
  •   orbfish    14 年前

    你的问题的正确答案是OMG小马的答案,存在的地方更具描述性,几乎总是更快。但是“selectnull”在我看来真的很难看而且违反直觉。我见过SELECT*或SELECT 1作为这方面的最佳实践。

    另一种方式,如果我们正在收集答案:

    SELECT u.id 
    FROM users u 
         JOIN posts p on u.id = p.user_id
    WHERE p.rating > 10
    GROUP BY u.id
    HAVING COUNT(*) > 1
    

    如果你测试的不是1,这可能会很有用。