Mysql
 sql >> база данни >  >> RDS >> Mysql

Уникална комбинация от две колони в mysql или postgres

Една опция за получаване на всички двойки, независимо дали са напред или назад (например (1, 2) ==(2, 1)) е да изберете LEAST() и GREATEST() от всеки ред и след това изберете отделни стойности. С помощта на тази заявка:

ИЗБЕРЕТЕ РАЗЛИЧНИ НАЙ-МАЛКИ(идентификатор на подател, идентификатор_на_получател), НАЙ-ГОЛЯМ(идентификатор на подател, идентификатор_на_получател)ОТ myTable; 

Ще получите следния резултат:

<предварителен код>| 1 | 2 || 1 | 3 |

След като имате това, можете да ГРУПИРАТЕ по тези, за да получите максималната дата за всяка двойка:

SELECT LEAST(sender_id, recipient_id), GREATEST(sender_id, recipient_id), MAX(created_at)FROM myTableGROUP BY LEST(sender_id, recipient_id), GREATEST(sender_id, recipient_id); 

Тази заявка ще ви даде данните, от които се нуждаете за всяка двойка, но няма да върне действителния ред от оригиналната ви таблица. Ако има ред във формат | 2 | 1 | 2014-10-15 | тази заявка ще върне | 1 | 2 | 2014-10-15 .

За да получите оригиналния ред от вашата таблица, трябва да JOIN при условие, че всички необходими колони съвпадат:

SELECT m.*FROM myTable mJOIN( SELECT LEAST(sender_id, recipient_id) AS small, GREATEST(sender_id, recipient_id) AS greatest, MAX(created_at) AS maxDate FROM myTable GROUP BY LEST(sender_id, recipient_id), GREATEST(sender_id, recipient_id)) tmpON tmp.least =LEAST(m.sender_id, m.recipient_id) И tmp.greatest =GREATEST(m.sender_id, m.recipient_id) И tmp.maxDate =m.created_at; 

Ето един SQL Fiddle пример, който отговаря на вашите очаквани резултати.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Най-добро съвпадение при използване на MySQL и PHP

  2. Upsert с включен атрибут updated_at

  3. Колко таблици мога да обединя с MySQL?

  4. Как да вмъкна данни в колони от PHP в MariaDB?

  5. уникален идентификатор в повече от една таблица [MySQL]