2009-10-30 25 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上的兩個表格,並僅使用一個查詢。