2011-10-12 61 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