2012-09-14 50 views
5

seleccionado Trataré de aclarar esto.MySQL - seleccione una fila - luego una siguiente y una anterior relativa al

Necesito seleccionar una fila específica y una fila relativa anterior de esa fila seleccionada y una fila siguiente relativa de esa fila seleccionada sin usar identificadores. es posible? El anterior y el siguiente, en resumen.

La razón por la que no puedo (tal vez no sé cómo) usar los identificadores, es porque no están en orden secuencial. Tienen vacíos como se puede ver en este ejemplo bastante inmaduro y aleatorio.

TABLE <-the name of the table 
+----+----------------------+-------+ 
| id | name     | value | 
+----+----------------------+-------+ 
| 1 | some_name   | asf | 
+----+----------------------+-------+ 
| 4 | hello    | A3r | 
+----+----------------------+-------+ 
| 5 | how_do_you_do  | HR5 | 
+----+----------------------+-------+ 
| 8 | not_bad    | 00D | 
+----+----------------------+-------+ 
| 12 | i_like_women   | lla | 
+----+----------------------+-------+ 
| 13 | are_you_serious  | 1Ha | 
+----+----------------------+-------+ 
| 15 | nah_i_kid   | Ad4 | 
+----+----------------------+-------+ 
| 17 | it_is_just_the_boobs | Zc5 | 
+----+----------------------+-------+ 
| 18 | thank_god   | 102 | 
+----+----------------------+-------+ 
| 44 | no_kidding   | jjy | 
+----+----------------------+-------+ 

Primero, necesito seleccionar una fila basada en el valor específico de una de sus columnas. Sé cómo hacer eso:

SELECT `value` 
FROM `TABLE` 
WHERE name = 'i_like_women' 

Esto seleccionará una fila con id 12 con el valor lla.

Lo que necesito es seleccionar otra al menos dos filas: una con el nombre 'not_bad' y otra con el nombre 'are_you_serious' sin especificarlo. O, en otras palabras, el anterior y el siguiente en relación con este seleccionado.

En resumen, se deben seleccionar tres filas basadas en un valor. Soy nuevo en MySQL, como puedes adivinar.

Gracias por su tiempo y atención. Disfruta de ayudarme

+0

Este post puede ser que http://stackoverflow.com/questions/1813641/select-a-row-and-rows-around-it – Jhonathan

+2

Hombre, me gusta este sitio web. – VolosBlur

Respuesta

7

La forma más sencilla de hacerlo es aprovechar el hecho de que, aunque no continua , tus identificaciones están en orden ascendente.

Por ejemplo:

SELECT * FROM Table WHERE id = 8 

UNION 
--Select the first item less than 8 
SELECT * FROM Table WHERE id = (SELECT MAX(id) FROM Table WHERE id < 8) 

UNION 
--select the first item greater than 8 
SELECT * FROM Table WHERE id = (SELECT MIN(id) FROM Table WHERE id > 8) 

Si sólo conoce la cadena, entonces:

DECLARE _id INT 

SELECT _id = id FROM Table WHERE value = 'i_like_women' 

Entonces sólo tiene que alimentar esta _id en la consulta anterior, en lugar de 8.

Tenga en cuenta que no necesita usar `para demarcar los nombres de tabla y columna.

+0

Sí. Creo que este funciona selecciona una fila específica y dos en los "otros lados". ¡Muchas gracias! – VolosBlur

4

la anterior puede ser recuperada con:

SELECT `value` 
FROM `TABLE` 
WHERE id < (SELECT id FROM `TABLE` WHERE name = 'i_like_women') 
ORDER BY id DESC 
LIMIT 1 

Usted puede hacer la consulta opuesta a encontrar el siguiente

+0

Este también funciona. ¿Puedes "UNIONAR" la "consulta opuesta" con esta? – VolosBlur

+0

@VolosBlur Sí. – Tchoupi

+0

¡¡Funciona para mí !! Gracias –

9

Aquí está la consulta que devolverá los tres registros.

SELECT * 
FROM `TABLE` 
WHERE id >= (
    SELECT id 
    FROM `TABLE` 
    WHERE id < (SELECT id FROM `TABLE` WHERE name = 'i_like_women') 
    ORDER BY id DESC 
    LIMIT 1 
) 
ORDER BY id ASC 
LIMIT 3 
+2

Dependiendo de lo que quiera el solicitante, esto puede no funcionar para el primer registro; usted traerá 3 de vuelta en lugar de 2, o tal vez nada en absoluto porque no hay identificación <1. De lo contrario, buen enfoque! – dash

+0

Pero funciona. PD lo hice. – VolosBlur

+0

@VolosBlur Cool - Yo también :-) Me sorprende que funcione si introduces 'un_nombre'. – dash

1

esta consulta está trabajando muy bien en el primer y último registro, así

SELECT * FROM `products` WHERE `ProductId` = (SELECT MAX(ProductId) FROM `products` WHERE ProductId < 1) AND SubCategoryId=1 


UNION 

SELECT * FROM `products` WHERE `ProductId` = (SELECT MIN(ProductId) FROM `products` WHERE ProductId > 1) AND SubCategoryId=1 


UNION 

SELECT * FROM `products` WHERE `ProductId` = (SELECT MIN(ProductId) FROM `products` WHERE ProductId < 1) AND SubCategoryId=1 


UNION 

SELECT * FROM `products` WHERE `ProductId` = (SELECT MAX(ProductId) FROM `products` WHERE ProductId > 1) AND SubCategoryId=1 


ORDER BY ProductId ASC 

espero que esto va a resolver su problema :)

1

he encontrado mejor y fácil respuesta para la pregunta de abajo (encontrando anterior y siguiente fila),

$neighbors = $this->WorkDescription->find('neighbors',array('field' => 'id', 'value' => 3)); 

que se da salida como esto:

Array 
(
    [prev] => Array 
     (
      [WorkDescription] => Array 
       (
        [id] => 1 
        [title] => Twenty 
        [ter_id] => 1 
        [cat_id] => 4  
        [writer] => abk 
        [director] => Dir 
        [producer] => pro 
       ) 
     ) 

    [next] => Array 
     (
      [WorkDescription] => Array 
       (
        [id] => 3 
        [title] => The Piper 
        [ter_id] => 1 
        [cat_id] => 3   
        [writer] => abk 
        [director] => Dir 
        [producer] => pro 
       ) 
      ) 
) 
Cuestiones relacionadas