2009-10-30 83 views
0

我正在运行以下查询:MySQL - 这可能在一个查询中?

SELECT * from people WHERE id = 4;

下表上

id  name   state age 
----------------------------------- 
1  tony jones  CA  22 
2  Sue Smith  FL  50 
3  Alex Guam  AL  44 
4  tony jones  SC  32 
5  tony jones  OH  12 
6  alex guam  RI  33 
7  tony Jones  CO  17 

我想,一个人叫这个名字生活在还回其他国家的列表,在我的查询例如

所以我的ID 4。对于“托尼琼斯” - 我还应该收到CA,OH,CO的“other_states”列表。

是否可能在一个查询中,还是需要在基于'name'的事实之后做一个单独的选择?

+1

只是一个普遍的警告:不要太在尽可能少的查询中做所有事情。通常情况下,结果只会让事情变得更复杂,甚至比使用多重查询更慢。 – 2009-10-30 21:17:42

+0

我绝对听到乔希。虽然我接受了詹姆斯的回答,但我想知道这是否比2个查询快。 – k00k 2009-10-30 21:20:46

回答

5

这会给你你在找什么:

select t.id, 
     t.name, 
     t.age, 
     t.group_concat(distinct t.state order by t.state separator ', ') as other_states 
from the_table t 
    inner join the_table u on t.name = u.name 
where u.id = 4 
group by t.id, t.name, t.age 
0

使用第二次选择。您可能能够使用临时表和联接来解决某些问题,但使用类似这样的查询来获取所需的信息将毫无意义。

1
SELECT p1.* from people p1 
    JOIN people p2 ON p1.name = p2.name 
WHERE p2.id = 4 

将返回与给定名称匹配的所有行。

0

一种方式是左连接表与自身,在名称匹配。更好的方法是将个人记录(姓名和年龄)分开,并放入另一个表格中。然后让这个表格包含刚创建的人员表格中的ID号码。然后,您可以加入人员记录ID上的两个表格,并仅使用一个查询。