2009-06-02 15 views
22

Mi propósito es: obtener múltiples filas de una lista de valores, como (1,2,3,4,5), ('a', 'b', 'c', 'cualquier cosa') y pronto.mysql falso seleccione

mysql> select id from accounts where id in (1,2,3,4,5,6); 
+----+ 
| id | 
+----+ 
| 1 | 
| 2 | 
| 3 | 
| 5 | 
| 6 | 
+----+ 
5 rows in set (0.00 sec) 

El SQL anterior es sin duda bien, pero mi pregunta es: ¿hay una manera de conseguir el mismo resultado sin

especificando una mesa porque mi propósito aquí es sólo para propagar filas por un id_set

?

otro ejemplo:

mysql> select now() as column1; 
+---------------------+ 
| column1    | 
+---------------------+ 
| 2009-06-01 20:59:33 | 
+---------------------+ 
1 row in set (0.00 sec) 

mysql> 

Este ejemplo propaga un único resultado fila sin especificar una mesa,

pero cómo propagar varias filas de una cadena como (1,2,3,4,5,6)?

+0

¿Qué filas? Las filas existen en una tabla. Sin la mesa no hay filas. – jmucchiello

+0

He actualizado mi pregunta, espero que se aclare esta vez :) – omg

Respuesta

22

Algo como esto debería funcionar:

SELECT * 
FROM (
    SELECT 0 as id 
    UNION SELECT 1 
    UNION SELECT 2 
    UNION SELECT 3 
    UNION SELECT 4 
    UNION SELECT 5 
) 
+1

Se siente bastante suelto, ¿hay alguna forma más compacta de escribir esta consulta? – omg

+0

¿Por qué seleccionar *? La consulta interna solo debería funcionar lo suficientemente bien. –

+0

Si no se utiliza una tabla de enteros como sugiere Alex Martelli, es lo más compacta que se puede obtener en una sola consulta. Podría crear una tabla temporal y usar INSERT INTO ... VALUES ((1), (2), (3), (4), (5) (6)) o algo así, luego SELECCIONAR DE esa tabla temporal. Se ve un poco más compacto, pero funcionalmente, hay más sobrecarga. – eksortso

6

MySQL tiene una tabla ficticia: DUAL. pero usar DUAL no cambia nada (es solo por conveniencia), y ciertamente no hace que esta consulta funcione.

Estoy seguro de que hay una mejor manera de lograr lo que estás tratando de hacer. Es posible que podamos ayudarlo si explica su problema.

+1

¡Gracias! Necesitaba DUAL para seleccionar valores constantes con una cláusula where. Es un truco para insertar constantes opcionalmente. – Jay

1

Esto no responde a su pregunta exactamente, pero creo que esto va a arreglar el problema real ..

SET @Counter = 0; SELECT (@Counter: = @Counter + 1 como contador) ... resto de su consulta

+0

mi demostración está usando un número entero, pero no está limitada a un número entero, también puede ser una lista de cadenas como ('a', 'b', 'cualquier cosa') – omg

+0

use una tabla temporal supongo entonces =) – Evert

+0

Entonces esta tabla temporal puede acumular para ser uno enorme, me temo – omg

0

Una técnica que he encontrado muy valiosa es an "integers table", lo que le permite hacer fácilmente todo tipo de cosas interesantes incluido éste (xaprb ha escrito varias publicaciones en el blog sobre esta técnica y la estrechamente relacionada "mesa mutex").

+0

No creo que sea estable, ya que tenemos que limpiar la mesa cada vez después de usarla, lo que puede ocasionar fallas. – omg

+0

@Shore, ¿por qué necesita borrar su tabla de enteros después de cada uso? Si es posible, puede hacer que la tabla sea permanente y seleccionarla según sea necesario. – eksortso

+0

parece que es la única manera de propagar filas fuera de la lista, digamos, DEBE con una tabla ... – omg

0

Una forma simple y pasada de moda es usar una tabla que contenga valores consecutivos.

DROP TABLE IF EXISTS `range10`; 
CREATE TABLE IF NOT EXISTS `range10` (
    `id` int(11) NOT NULL, 
    KEY `id` (`id`) 
) ENGINE=MyISAM; 
INSERT INTO `range10` (`id`) VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); 

Una vez instalado, puede escribir consultas como se muestra a continuación.

conseguir cada segunda fila:

select * from your_data_table where id in (
SELECT id*2 as id FROM `range10` WHERE id in(
    select id from `range10` 
) 
) 

obtener los registros de 1101 a 1111:

select * from your_data_table where id in (
SELECT id+1100 as id FROM `range10` WHERE id in(
    select id from `range10` 
) 
) 

Así que si usted está en la necesidad de mayores rangos, a continuación, sólo aumentar el tamaño de los valores consecutivos en el rango de tabla10. Las consultas son simples, el costo es bajo, no se necesita ningún procedimiento o función almacenada.

Nota:

Puede crear una tabla con los valores CHAR consecutivos, también. Pero variar los contenidos no sería tan fácil.

Cuestiones relacionadas