联合选择使用从前一个选择返回的值

时间:2014-04-04 13:56:20

标签: mysql sql

我有一个这样的数据库设置,有两个表:

CREATE TABLE users 
    (
     id int auto_increment primary key, 
     username varchar(20), 
     password varchar(30),
     auth_ip varchar(15),
     account_type varchar(10),
     server_name varchar(20)
    );

CREATE TABLE servers 
    (
     id int auto_increment primary key, 
     name varchar(20), 
     address varchar(30),
     reserved boolean,
     user varchar(20)
    );

我正在尝试编写一个允许我按用户名搜索用户的查询,然后在server_name表中列出server_name为name的行的信息。例如,我可能有200个用户和5个服务器,所以当我搜索用户名foo521时,它会返回用户表中的信息,以及server_name定义的服务器的服务器表。

我是SQL的新手,所以从基本的googlefu我认为最好的选择是做一些事情:

SELECT * FROM users WHERE username = "foo"
UNION
SELECT address FROM servers WHERE name = something.server_name

重要的是,这会使用一个查询返回结果,而不是倍数。有人可以提供一些意见吗?我正在使用SQLite,所以AFAIK它必须是一个平面文件数据库,但我可能错了。

2 个答案:

答案 0 :(得分:2)

SELECT *
FROM `users` AS u
LEFT JOIN `servers` AS s
    ON u.server_name = s.name
WHERE u.username = 'foo'

答案 1 :(得分:2)

你会想要做这种性质的事情:

SELECT u.*
FROM `users` AS u
INNER JOIN `servers` AS s
    ON u.server_name = s.name
WHERE u.username = 'foo'

我会查看如何加入像here这样的表格,以便在@ Lamak的帖子和我的帖子中看到:

  • 内部联接只会显示两个表中都有一些联系的数据;如果它不存在于其中一个,那么该记录就不会出现。
  • 如果其中一个引用的表没有相关信息,则左/右连接将为您提供空结果。
  • 始终使用别名,并在select语句中指定它们。如果您不这样做,它将返回所有已连接表的返回记录。如果你期待这种情况发生,这很好。
  • 正如@Winkbrace所指出的,请确保正确设置主键/外键。您的一个主要ID应该是另一个表中的外键。完成后,您应该在联接中使用以下内容:

      INNER JOIN `servers` AS s ON u.server_id = s.server_id