Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MYSQL wybierz wszystkie rekordy, w których para nazwa użytkownika i data występują więcej niż jeden raz

create table table1
(
    id int auto_increment primary key,
    username varchar(30) not null,
    `date` date not null
);

insert table1 (username,`date`) values ('john','2015-01-01');
insert table1 (username,`date`) values ('kim','2015-01-01');
insert table1 (username,`date`) values ('john','2015-01-01');
insert table1 (username,`date`) values ('john','2015-02-01');
insert table1 (username,`date`) values ('john','2015-03-01');

SELECT t1.* 
from table1 t1
join
(
    select username,`date`,count(*)
    from table1
    group by username,`date`
    having count(username)>1
) inr
on inr.username=t1.username and inr.`date`=t1.`date`

wyniki w 2 pokazanych wierszach

+----+----------+------------+
| id | username | date       |
+----+----------+------------+
|  1 | john     | 2015-01-01 |
|  3 | john     | 2015-01-01 |
+----+----------+------------+
2 rows in set (0.03 sec)

Edytuj:

zgodnie z żądaniem OP, miej kolumnę do oznaczania duplikatów do późniejszej pracy, w przeciwieństwie do instrukcji SELECT. Pamiętaj, że możesz Alter Table i dodaj tę kolumnę z flagą dopuszczającą wartość null, ustaw ją, użyj wartości w wolnym czasie, później Alter Table i upuść.

Ale zacznę tutaj od nowa z tworzeniem tabeli z nową kolumną flag:

create table table1
(
    id int auto_increment primary key,
    username varchar(30) not null,
    `date` date not null,
    dupeflag int null --    <---- New flag column, nullable, ignored on inserts below
);

insert table1 (username,`date`) values ('john','2015-01-01');
insert table1 (username,`date`) values ('kim','2015-01-01');
insert table1 (username,`date`) values ('john','2015-01-01');
insert table1 (username,`date`) values ('john','2015-02-01');
insert table1 (username,`date`) values ('john','2015-03-01');

update table1 t1
join 
(   select username,`date`,count(*)
    from table1
    group by username,`date`
    having count(username)>1
) inr
on inr.username=t1.username and inr.`date`=t1.`date`
set dupeflag=1;

-- 2 rows affected

select * from table1;

+----+----------+------------+----------+
| id | username | date       | dupeflag |
+----+----------+------------+----------+
|  1 | john     | 2015-01-01 |        1 |
|  2 | kim      | 2015-01-01 |     NULL |
|  3 | john     | 2015-01-01 |        1 |
|  4 | john     | 2015-02-01 |     NULL |
|  5 | john     | 2015-03-01 |     NULL |
+----+----------+------------+----------+
5 rows in set (0.00 sec)



  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:Nie można utworzyć/zapisać do pliku '/tmp/#sql_3c6_0.MYI' (Errcode:2) - Co to w ogóle oznacza?

  2. Przenoszenie kolumn tekstowych szerokości/długości geograficznej do kolumny typu „punkt”

  3. Używanie SQLAlchemy ORM dla klucza innego niż podstawowy, unikalny, automatycznie zwiększający się identyfikator

  4. Czy istnieje lepszy sposób na przypisanie uprawnień do tabel tymczasowych w MySQL?

  5. Hibernate + MySQL:Jak ustawić kodowanie utf-8 dla bazy danych i tabel