2013-01-01 45 views
0

我有兩個表,我需要以特定的方式進行組合。我需要在一個表中顯示一次信息,但我需要下一個表中的信息來返回它所有的匹配數據。這裏是我的榜樣問題與複雜的Sql加入查詢

用戶


| id | name | 
------------- 
| 1 | mike | 
| 2 | john | 
| 3 | bill | 
------------- 

----------------- 
| uid | subject | 
----------------- 
| 1 | math | 
| 1 | English | 
| 2 | math | 
| 3 | math | 
| 3 | English | 
----------------- 

預期結果

-------------------- 
|name | mike  | 
--------------------- 
|subject| math  | 
|  | English | 
--------------------- 

-------------------- 
|name | subject | 
--------------------- 
|mike | math  | 
|  | English | 
--------------------- 

這是我當前的查詢

SELECT user.name, class.subject 
FROM user 
join class on class.uid = user.id 
WHERE (user.name like '%mike%') 

回報

-------------------- 
|name | subject | 
--------------------- 
|mike | math  | 
|mike | English | 
--------------------- 

,但我想刪除所有名稱重複。任何人都可以與此查詢

+1

。這不是加入期望的標準結果。 –

+3

IMO你會濫用數據庫在那裏做這項工作。您應該按'name'命令並在您的應用程序代碼中進行分組。 –

+1

SQL實際上並不如此。如果你想在應用程序輸出中分組,那麼應該在那裏完成演示。它可以通過很多_horrifying string manipulation_來完成,但是在應用程序層中更適合。 –

回答

2

您可以使用連接類型函數將值鏈接到分隔字符串中。

Select u.name, (
     select 
     GROUP_CONCAT(c.subject) FROM classes c where u.id = c.uid 
    ) As subjects 
    From user u 

所以爲什麼你認爲它應該返回一個空的第二行,結束了

-------------------- 
|name | subjects | 
--------------------- 
|mike | math, English | 
+1

你不是剛剛重塑'GROUP_CONCAT()'? – Barmar

+0

也許,只是顯示的概念,即時通訊不大的非iso的東西 –

+0

這個選項很適合我需要做的感謝 – sfjamrock

1
set @lastname = null; 
select case when name = @lastname 
      then "" 
      else @lastname := name 
     end name, 
     subject 
from (select name, subject 
     from user 
     join class on id = uid 
     where name like '%mike%' 
     order by name) x 

FIDDLE

但是幫助,爲他人在評論中指出,這通常是在應用程序代碼中完成,而不是在SQL。在處理行的循環中,只需檢查名稱是否與前一個名稱相同,並將該表字段留空即可。或者使用一個網格小工具爲你自動分組。