1

假设我有一个名为 users 的表,它具有以下值:ip、id 和 user。如果我想根据 ip 获取所有用户,但没有 ip,那么我会先做,然后再做select ip from users where user = "user";select user from users where ip = "xxx.xxx.xxx.xx[x]";(x 是从第一个查询中获得的 ip 号)。有没有办法像select user from users where ip = "[insert ip query here to get ip]"在 1 个查询中压缩整个事情一样?我知道这对 2 条语句可能听起来很傻,但是每个 cpu 周期对我的程序都很重要,尤其是在一个相当慢的平台上。

4

3 回答 3

2

如果我理解正确,您正在寻找的查询的问题是Find me all users who share the same ip as userX。如果是这种情况,那么您可以使用JOIN

SELECT DISTINCT u1.user 
  FROM users u1 JOIN users u2
    ON u1.ip = u2.ip
 WHERE u2.user = 'some_user';

或使用子查询

SELECT user 
  FROM users
 WHERE ip IN
 (
     SELECT DISTINCT ip
       FROM users
      WHERE user = 'some_user'
 );

或与EXISTS

SELECT DISTINCT u.user 
  FROM users u 
 WHERE EXISTS
 (
     SELECT *
       FROM users
      WHERE ip = u.ip
      AND user = 'some_user'
 );

注意:确保您在ip和上有索引user

这是SQLFiddle演示

于 2013-09-12T03:34:41.963 回答
0

看起来您正在执行两次相同的查询,以下示例显示了一个嵌套选择,它是一个非常多余的示例,但它显示了您想要的(我认为)

SELECT user FROM users 
WHERE user = (SELECT user FROM users 
              WHERE ip = "xxx.xxx.xxx.xx[x]");

在此查询中,子查询实际上将返回与外部查询相同的结果,因此毫无意义。

于 2013-09-12T03:32:48.570 回答
-1

我想你可以像这样使用子查询:从用户中选择用户,其中 ip 在(从用户中选择 ip,用户喜欢“%user%”)

于 2013-09-12T03:30:46.020 回答