2010-02-13 14 views
5

Esto puede no ser muy sensato, pero me gustaría dejar que MySQL me devuelva las filas duplicadas exactas si hay criterios duplicados en la cláusula WHERE IN. es posible?¿Obliga a MySQL a devolver duplicados de la cláusula WHERE IN sin utilizar JOIN/UNION?

Tome este ejemplo:

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

I'ld como MySQL me devuelve filas con id 5 tres veces, de 1 2 Identificación y dos veces, y 3 y 4 una vez.

A medida que la longitud de los argumentos IN, así como el recuento duplicado (una, dos, tres veces, etc.), habrá arbitraria no quiero depender de UNION o JOIN. ¿Es posible algo así?

Respuesta

2

No estoy seguro de por qué quieres prohibir JOIN porque es bastante esencial para SQL. Es como prohibir llamadas a funciones en un lenguaje funcional.

Una buena manera de resolver esto es crear un conjunto de resultados que contenga los identificadores que desea devolver y unirse a él. Aquí hay una manera de hacerlo:

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 

No estoy seguro de si ha considerado este método? No tiene ninguno de los problemas que pareces tener miedo.

Si prohibe las uniones, no puede hacerlo a menos que use un procedimiento almacenado, lo que yo diría que es peor que unirme.

+0

Hola Marcos, gracias por tu respuesta. Por el aspecto de las cosas, supongo que tendré que ir con JOIN y UNION entonces. No estaba al tanto del uso de UNION como lo está usando aquí. Ni siquiera estoy seguro de entenderlo por completo. :) ¡Pero se ve muy ingenioso! La razón por la que no quería usar UNION al principio, es porque pensé que tendría que repetir las instrucciones SELECT exactas una y otra vez. Esto parece mucho más limpio. –

+0

Por cierto, ¿estas UNIONES garantizarán el orden exacto del resultado, o necesitaré usar una cláusula ORDEN para ordenarlas exactamente como fueron en la declaración? –

+0

* Necesita * una orden por si desea garantizar la orden. Esto es siempre verdad Afortunadamente es fácil cambiar la consulta anterior: 'SELECT 1 como ID, 1 como SortOrder UNION ALL SELECT 2, 2 UNION ALL SELECT 3, 3' etc ... luego' ORDER BY SortOrder' al final después de 'JOIN .. ENCENDIDO ... '. –

Cuestiones relacionadas