sql >> Database teknologi >  >> RDS >> Mysql

MYSQL vælger alle poster, hvor brugernavn og datopar forekommer mere end én gang

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`
 

resultater i 2 rækker vist

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

Rediger:

i henhold til OP-anmodning, have en kolonne til at markere duper til senere arbejde, i modsætning til en udvalgt erklæring. Bemærk, at du kan Alter Table og tilføj denne nullable flag-kolonne, indstil den, brug værdier i ro og mag, senere Alter Table og slip det.

Men jeg vil lige starte forfra her med oprettelsestabellen med ny flagkolonne:

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. Tilføj interval til tidsstemplet ved hjælp af Ecto Fragments

  2. Databaseforbindelse eller godkendelsesfejl med Movable Type

  3. hvordan man bruger LINQ til SQL med mySQL

  4. WHERE value IS NOT IN (underforespørgsel)