2012-02-20 41 views
3

我需要通过他的ID来获取用户的年龄。简单。 问题是,在我第一次不知道他们的ID时,我唯一知道的是它在一个特定的表中,让我们将其命名为“第二个”。一个查询中的两个select语句

SELECT `age` FROM `users` WHERE `userid`=(SELECT `id` FROM `second`) 

我该怎么做?

+2

只是改变=在 – Vikram 2012-02-20 02:31:00

回答

6
SELECT age FROM users WHERE userid IN (SELECT id FROM second) 

这应该工作

+0

http://en.wikipedia.org/wiki/Correlated_subquery 再次我建议加入。 – Jordan 2012-02-20 02:56:47

1

你想 '在' 语句使用:

 
select * from a 
    where x=8 and y=1 and z in (
     select z from b where x=8 and active > '2010-01-07 00:00:00' group by z 
    ) 
2

SELECT age FROM users inner join Second on users.UserID = second.ID

内部联接会比一个子选择

更有效
+0

并非总是如此。除了效率,还有正确性。这个查询和OP与'IN'子查询不会产生相同的结果。 – 2012-02-20 02:41:39

+0

根据我的理解,只有当内部联接没有执行子查询时,子查询才会被优化器更改为内部联接。在这种情况下,他们当然同样运行。 出于好奇,我错过了什么,答案的领域不会是相同的? OP没有用in指定子查询,在我看来,OP正在使用一个伪代码(授予非常接近正确)来表示他/她的需求。否则,我们可能只是说 WHERE Userid =(SELECT top 1 id FROM second)' – Jordan 2012-02-20 02:53:47

+1

'IN'与子查询和'JOIN'的区别在于Join可能产生多个结果(在这种情况下许多相同的年龄) 。如果'id'是主键,那么这不会发生。你说得对,在MySQL中,“IN”并没有以最佳方式进行优化。但总的来说,“一个JOIN会比一个子选择更有效”这句话不是事实。 – 2012-02-20 06:35:04

2
SELECT age FROM users WHERE userid IN (SELECT id FROM second) 

但优选

SELECT u.age FROM users u INNER JOIN second s ON u.userid = s.id