2011-10-12 78 views
-2

我有一個名爲loc的表有屬性locid,sid,role,link,href。 我需要提取所有這些超級鏈接id 1,2,3,4,5,6,7,8,9 但3有兩個locid 3 & 4.我需要從3和4中提取內容。但是我的sid不應該重複需要查詢下表

   Locid   Sid 
      1     1 
      2    2 
      3    3 
      4    3 
      5    4 
      6    7 
      7    7 
      8    7 
      9    8 
      10    8 
      11    4 
      12    4 
      13    9 
      14    4 

我放出來應該是這種形式

  Sid  locid 
      1  1 
      2  2 
      3  3 
        4 

      4  5 
        11 
        12 
        14 

      7   6 
         7 
         8 

      8   9 
         10 

      9   13 
+1

這是你的應用程序的工作格式不同(隱藏重複的Sid),而不是SQL服務器。他們確實不那麼幹淨。 –

+0

select * from Loc where sid = Locid;它給我只有4行 – user977830

回答

0

嗯,你的結果不是一個乾淨的2維表,所以你不得不在LOCID捲起成一個值。 MySQL提供了GROUP_CONCAT功能:

我沒有測試過這一點,但這樣的:

SELECT sid, GROUP_CONCAT(locid SEPARATOR ', ') FROM mytable GROUP BY sid 

這將導致:

1 1, 
2 2, 
3 3, 4 
4 5, 11, 12, 14 
+0

'CONCAT'不是一個公認的內置函數名稱。 givin me error – user977830

+0

查看更新的答案。 –

+0

先生正在使用sql server 2005 ...'GROUP_CONCAT'不是公認的內置函數名稱。 – user977830

0

如果你想保持空的,我不明白空格或刪除sid值重複的地方。 這應該給你只爲唯一的SID行的值

SELECT sid, locid FROM mytable GROUP BY sid; 

如果你有大量的數據,您可以選擇並插入到另一個表或到文本文件

CREATE TABLE temp LIKE mytable; 
INSERT INTO temp 
SELECT sid, locid FROM mytable GROUP BY sid; 
DROP mytable; 
ALTER TABLE temp RENAME mytable; 

,或者一個在文本文件輸出:

SELECT sid, locid FROM mytable GROUP BY sid 
INTO OUTFILE 'C:/myfolder/mytextfile.txt'; 

給它一個嘗試和更新後:)

1
select 
    sid = case when rn1 = 1 then sid end, 
    locid 
from 
(
    select 
     sid, 
     locid, 
     rn1 = row_number() over(partition by sid order by locid), 
     rn2 = row_number() over(order by sid, locid) 
    from tablename 
) t 
order by rn2