2010-02-13 9 views
5

Questo potrebbe non essere molto ragionevole, ma mi piacerebbe lasciare che MySQL mi restituisca le esatte righe duplicate se ci sono due criteri nella clausola WHERE IN. È possibile?Forza MySQL per restituire i duplicati dalla clausola WHERE IN senza utilizzare JOIN/UNION?

Prendete questo esempio:

SELECT 
    columns 
FROM 
    table 
WHERE 
    id IN(1, 2, 3, 4, 5, 1, 2, 5, 5) 

Se mai come MySQL per tornare me le righe con id 5 tre volte, di 1 id e 2 due volte, e 3 e 4, una volta.

Come la lunghezza delle IN argomenti, così come il numero di duplicato (una, due, tre volte, etc.), sarà arbitrario Non voglio fare affidamento su UNION o JOIN. È possibile qualcosa del genere altrimenti?

risposta

2

Non sono sicuro del motivo per cui si desidera escludere JOIN poiché è piuttosto essenziale per SQL. È come vietare le chiamate di funzione in un linguaggio funzionale.

Un buon modo per risolvere questo è creare un set di risultati contenente gli ID che si desidera restituire e unirsi ad esso. Ecco un modo per farlo:

SELECT Table1.* 
FROM Table1 
JOIN (SELECT 1 AS id 
     UNION ALL SELECT 2 
     UNION ALL SELECT 3 
     UNION ALL SELECT 4 
     UNION ALL SELECT 5 
     UNION ALL SELECT 1 
     UNION ALL SELECT 2 
     UNION ALL SELECT 5 
     UNION ALL SELECT 5) AS T1 
ON Table1.id = T1.id 

Non sono sicuro di aver preso in considerazione questo metodo? Non ha nessuno dei problemi di cui sembri aver paura.

Se si blocca join non è possibile farlo a meno che non si utilizzi una stored procedure, che direi che è peggio di unirsi.

+0

Ciao Mark, grazie per la tua risposta. Dall'aspetto delle cose, suppongo che dovrò andare con JOIN e UNION quindi. Non ero a conoscenza dell'uso di UNION nel modo in cui lo stai usando qui. Non sono nemmeno sicuro di averlo capito completamente. :) Ma sembra molto elegante! Il motivo per cui all'inizio non volevo usare UNION, è perché pensavo di dover ripetere ripetutamente le esatte istruzioni SELECT. Questo sembra molto più pulito però. –

+0

A proposito, queste UNION garantiranno l'ordine esatto del risultato, o avrò ancora bisogno di usare una clausola ORDER per ordinare esattamente come sono andate nella dichiarazione? –

+0

È * necessario * un ordine se si desidera garantire l'ordine. Questo è sempre vero. Fortunatamente è facile cambiare la query precedente: 'SELEZIONA 1 come ID, 1 come SortOrder UNION ALL SELECT 2, 2 UNION ALL SELECT 3, 3' etc ... quindi 'ORDER BY SortOrder' alla fine dopo il' JOIN .. . ON ... '. –

Problemi correlati