2017-01-31 8 views
0

Я хочу выбрать строки без повторяющихся значений в столбцах. Я имею в виду, что если есть строка с | 2 | 1 | и еще один с | 1 | 2 | в текущем отборе я хочу показать только один из них.sql select без дубликатов в обоих столбцах

+------+------+ 
| id1 | id2 | 
+------+------+ 
| 2 | 1 | 
| 4 | 3 | 
| 3 | 4 | 
| 1 | 4 | 
+------+------+ 

поэтому в приведенном выше примере он будет выбирать только первую, последнюю и вторую или третью строку.

, а также заменить эти значения на строку «TITLE» из другой таблицы.

табличные значения:

+----+----------+ 
| id | title | 
+----+----------+ 
| 1 | title1 | 
| 2 | title2 | 
| 3 | title3 | 
| 4 | title4 | 
+----+----------+ 

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

ответ

2

Вы можете использовать least и greatest. least получает меньшее значение id1, id2 и greatest получает больше id1, id2.

select distinct least(id1,id2),greatest(id1,id2) 
from t 

Фактически вышеизложенное создает строки, которые не находятся в таблице. Чтобы избежать этого, вам понадобится left join с производной таблицей.

select t1.id1,t1.id2 
from t t1 
left join (select least(id1,id2) as id1,greatest(id1,id2) as id2 
      from t 
      group by least(id1,id2),greatest(id1,id2) 
      having count(*) > 1 
     ) t2 on t2.id1=t1.id1 and t2.id2=t1.id2 
where t2.id1 is null and t2.id2 is null 

Редактировать: Чтобы получить заголовок строки из другой таблицы на основе идентификаторов

select t1.id1,t1.id2,tt1.title,tt2.title 
from t t1 
left join (select least(id1,id2) as id1,greatest(id1,id2) as id2 
      from t 
      group by least(id1,id2),greatest(id1,id2) 
      having count(*) > 1 
     ) t2 on t2.id1=t1.id1 and t2.id2=t1.id2 
join titles tt1 on tt1.id=t1.id1 --use a left join if the titles table won't have all the id's 
join titles tt2 on tt2.id=t1.id2 --use a left join if the titles table won't have all the id's 
where t2.id1 is null and t2.id2 is null 
+0

Ничего себе, это действительно помогло. Можете ли вы также помочь с заменой текущих значений в этой таблице значениями, хранящимися в другой таблице? Если у меня есть «значения» таблицы со строковыми значениями для каждого идентификатора, как у меня есть только строки, которые были напечатаны (выбраны)? – hvertous

+0

, пожалуйста, покажите некоторые примеры данных. –

+0

У меня есть другая таблица 'values' с двумя столбцами: 'id' и string 'Title'. Мне нужно заменить идентификаторы select в сообщении OP на «заголовки». Надеюсь, я прояснил – hvertous

 Смежные вопросы

  • Нет связанных вопросов^_^