SQL сложный групповой запрос - PullRequest
       6

SQL сложный групповой запрос

3 голосов
/ 10 сентября 2009

У меня есть таблица со следующими строками:

id. type  - link 

 1. image - http://1
 2. image - http://2
 3. text  - none
 4. video - http://..
 5. image - http://..
 6. text  - http://..

Я хочу сгруппировать тип (изображение) по дате, чтобы они отображались в одной строке. В этом примере первые два изображения будут объединены, и результат будет выглядеть следующим образом:

1. image - http://1, http://2  ** GROUPED BY DATE, if they are same type and not break type after it.
2. text  - none
3. video - http://..
4. image - http://..
5. text  - http://..

Ответы [ 4 ]

1 голос
/ 10 сентября 2009
SELECT  grouper, type, GROUP_CONCAT(link)
FROM    (
        SELECT  @group := @group + (NOT (COALESCE(@type, type) = type)) AS grouper,
                @type := type,
                m.*
        FROM    (
                SELECT  @group := 0,
                        @type := NULL
                ) vars,
                mytable m
        ) q
GROUP BY
        grouper
1 голос
/ 10 сентября 2009

С MySQL вы можете сделать это:

SELECT id, type, group_concat(link) 
FROM table
GROUP BY id, type
0 голосов
/ 10 сентября 2009

Вот полный эквивалентный пример для SQL Server 2005 и более поздних версий:


create table #Temp
    (GroupField int, ValueType varchar(10), Value varchar(2048))

insert into #Temp (GroupField, ValueType, Value) VALUES (1, 'image', 'http://1')
insert into #Temp (GroupField, ValueType, Value) VALUES (1, 'image', 'http://2')
insert into #Temp (GroupField, ValueType, Value) VALUES (2, 'text', 'none')
insert into #Temp (GroupField, ValueType, Value) VALUES (2, 'video', '30mins')
insert into #Temp (GroupField, ValueType, Value) VALUES (2, 'image', 'http://5')
insert into #Temp (GroupField, ValueType, Value) VALUES (3, 'image', 'http://4')
insert into #Temp (GroupField, ValueType, Value) VALUES (3, 'text', 'hello')
insert into #Temp (GroupField, ValueType, Value) VALUES (3, 'image', 'http://7')
insert into #Temp (GroupField, ValueType, Value) VALUES (4, 'image', 'http://0')

    SELECT GroupField, ValueType,
           LEFT([Values],LEN([Values]) - 1)   AS [Values]
    FROM   (SELECT GroupField, ValueType,
                   (SELECT value + ', ' AS [text()]
                    FROM   #Temp AS internal
                    WHERE  internal.GroupField = GroupFields.GroupField and internal.ValueType = GroupFields.ValueType 
                    FOR xml PATH ('')
                   ) AS [Values]
            FROM   (SELECT  GroupField, ValueType
                    FROM     #Temp
                    GROUP BY GroupField, ValueType) AS GroupFields) AS pre_trimmed;

Создает результат:


GroupField   ValueType    Values
1            image        http://1, http://2
2            image        http://5
2            text         none
2            video        30mins
3            image        http://4, http://7
3            text         hello
4            image        http://0

Для вашего конкретного случая могут потребоваться некоторые ORDER BY предложения ... адаптировано из Rational Relational - эмуляция функции MySQL GROUP_CONCAT () в SQL Server 2005

0 голосов
/ 10 сентября 2009
select id, type, group_concat(link) from table

Попробуйте это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...