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, но с таким небольшим набором данных, я не могу быть уверен, что это будет работать для всего вашего набора. У меня гораздо больший запрос, который, скорее всего, будет работать с большим набором данных, но он довольно неоптимизирован.