Selezionare le righe in cui la prima colonna contiene gli stessi dati in più di un record

Ci sono un sacco di domande con titoli simili, ma non sono stato in grado di trovare una risposta che non coinvolge il gruppo (GROUP BY x HAVING COUNT(*) > 1), ma quello che sto cercando è una query che restituisce tutte le righe separate (in MySQL).

Dire che ho i seguenti:

id  data
1    x
2    y
3    y
4    z

Quello che voglio restituire è:

2    y
3    y

basa sul fatto che le righe 2 e 3 sono identici valori nella colonna di dati.

SELECT * FROM tabella WHERE [dati contiene un valore che esiste in qualche altra riga]

Modo in cui i dati sono uguali, ma l’id non lo sono?
perché SELECT * FROM tabella WHERE data = ‘y’ non si applica a voi?
In questo esempio, sì. Ma, in generale, dove il contenuto di una colonna è uguale indipendentemente dal contenuto di altre colonne.
Perché non so che si tratta di ‘y’. È solo un esempio. Quello che so è che voglio tutte le righe tranne quelli in cui una particolare colonna ha un peculiari valore.
Sì, l’id è univoco, ma è irrilevante il problema. Nella tabella ci sono un sacco di altre colonne che non sono gli unici. La cosa interessante è che i dati (nell’esempio) non è univoco.

OriginaleL’autore linurb | 2014-06-02

2 Replies
  1. 5
    SELECT DISTINCT x.* 
      FROM table1 x 
      JOIN table1 y 
        ON y.id <> x.id      --   ids are NOT equal 
       AND y.data = x.data;  --   but data IS

    http://sqlfiddle.com/#!2/f8910

    Questa query e fP sopra sono probabilmente quasi equivalenti in termini di prestazioni – ma riscrivere pq in questo modo e guardarlo andare…

    SELECT DISTINCT x.id 
      FROM table1 x
      JOIN 
         ( SELECT data FROM table1 GROUP BY data HAVING COUNT(0) > 1 ) y
        ON y.data = x.data;
    Con la prima query ho avuto lo stesso risultato, cioè ho dovuto riavviare il server db. Ma la tua riscrittura della fP query ha fatto il trucco. Grazie! Vorrei solo che ho capito che cosa rende gli altri due problemi.

    OriginaleL’autore Strawberry

  2. 7

    Devi metterlo in una sottoquery

    select * from table where data in (
        select data from table group by data having count(*) > 1
    )
    Grazie, ma ho già provato. È estremamente lento, e il database si blocca e deve essere riavviato. Qualche idea del perché?
    Perché non abbiamo gli indici della tabella forse? In particolare sulla colonna data.
    Ho. E la sottoquery è abbastanza veloce, in sé. Strano.
    Hai controllato con EXPLAIN SELECT ... se l’indice è molto utilizzato?
    La sottoquery è, ma non su PK. Io non sono sicuro di come interpretare. PRIMARIA – l’Utilizzo di where (31 394 righe), DIPENDENTE di una SUBQUERY – Usando l’indice di

    OriginaleL’autore fancyPants

Lascia un commento