SQL: как выбрать один раз 2 столбца значения в результате

Я имею:

ID  USER1  USER2  TEXT
=======================
1   Toto    Roro  Text1
2   Toto    Riri  Text2
3   Tata    Roro  Text3
4   Titi    Rara  Text4
5   Tutu    Riri  Text5

Мне нужно:

ID  USER1   USER2  TEXT
=======================-
1   Toto    Roro  Text1
4   Titi    Rara  Text4
5   Tutu    Riri  Text5

Мне бы хотелось, чтобы USER1 и USER2 появлялись в моем результате только один раз, а порядок по id asc.

Я мог бы сделать много разных с подзапросом, но я думаю, что это не оптимизировано...

Например, я хотел бы ограничить число результатов до 10, потому что в моей таблице много строк.

У меня есть что-то подобное:

SELECT *
FROM (
    SELECT DISTINCT ON (user2) *
    FROM (
        SELECT DISTINCT ON (user1) *
        FROM (
            SELECT *
            FROM
                test
            ORDER BY
                id ASC
            LIMIT 100
        ) as foo1
        ORDER BY user1, id ASC
        LIMIT 100
    ) as foo2
    ORDER BY user2, id ASC
    LIMIT 100
) as foo3
ORDER BY id ASC
LIMIT 10

2 ответа

    Select * from table t1
    Where not exists (select 1 from table t2
                      where t2.id<t1.id 
                      and (t1.user1 in (t2.user1, t2.user2) 
                          or t1.user2 in (t2.user1, t2.user2)
                          )
                      )

Пришлось редактировать на моем ноутбуке. Я думаю, это то, что вы имеете в виду. и вы хотите ограничить число результатов до 10, а затем просто поместить топ-10 в выбор или я неправильно понял?

Понял! http://sqlfiddle.com/

select sj1.uid as uid,
sj1.u1 as u1,
sj2.u1 as u2,
j.text
from jargon as j

    ,(select j1.user1 as u1,
    j1.user2 as u2,
    min(j1.id) as uid,
    count(j1.user1)
    from jargon as j1
    group by j1.user1) as sj1

    ,(select j2.user2 as u1,
    count(j2.user2)
    from jargon as j2
    group by j2.user2) as sj2

where sj1.u2 = sj2.u1
and j.id = sj1.uid
group by sj2.u1
having min(sj1.uid)
order by sj1.uid asc

Это возвращает строки 1, 4, 5, но с таким небольшим набором данных, я не могу быть уверен, что это будет работать для всего вашего набора. У меня гораздо больший запрос, который, скорее всего, будет работать с большим набором данных, но он довольно неоптимизирован.

Другие вопросы по тегам