2010-07-09 36 views
10

si tuviera una consulta comoagarrando primera fila de una consulta MySQL solamente

select * from tbl_foo where name = 'sarmen' 

y esta tabla tiene varias instancias de name = Sarmen cómo puedo números de fila prácticamente asignar a cada fila sin tener que crear una columna que incriments auto? Tengo una razón para lo que estoy haciendo y no necesito una columna autoincrificada en mi ejemplo.

así que si cada fila asigna un número de fila virtual a través de sql o tal vez php, podré imprimir la primera fila o la última fila en cualquier momento que lo necesite.

thnx

Respuesta

16

Para volver sólo una fila utilizar LIMIT 1:

SELECT * 
FROM tbl_foo 
WHERE name = 'sarmen' 
LIMIT 1 

En no tiene sentido decir 'primera fila' o 'última fila' a menos que tenga una cláusula ORDER BY. Suponiendo que se agrega una cláusula ORDER BY entonces usted puede limitar el uso de las siguientes maneras:

  • para conseguir la primera fila utilizar LIMIT 1.
  • Para obtener la segunda fila puede usar el límite con un desplazamiento: LIMIT 1, 1.
  • Para obtener la última fila invierta la orden (cambie ASC a DESC o viceversa) luego use LIMIT 1.
+0

En realidad, sí tiene sentido para referirse a 'última fila' y 'primera fila'. Solo tienes que entender algunas cosas sobre las bases de datos. Como el hecho de que debe usar ORDER BY si necesita que el conjunto de resultados se ordene de cierta manera. –

+2

@George Marian: Sí, es por eso que escribí "a menos que tengas una cláusula ORDER BY". –

+0

Lo quise decir como una expansión de su respuesta y solo brindé un ejemplo: el mismo que brindó. Dicho esto, el conjunto de resultados se representa como filas, sin importar el orden. Necesitamos entender las diferencias entre un conjunto de resultados y una tabla. Puede que no me importe el orden en el que están, pero quiero referirme a la primera o a la última fila de ese conjunto de resultados.Mis disculpas por ser pedante, pero eso es típicamente necesario en nuestra industria. –

-1

uso del ROWNUM pseudocolumna

+4

Eso funcionaría para Oracle, no para MySQL –

+1

sí - definitivamente soy un tipo Oracle - lo siento – Randy

5

No ha especificado cómo se determina el orden, pero esto le dará un valor de rango en MySQL:

SELECT t.*, 
     @rownum := @rownum +1 AS rank 
    FROM TBL_FOO t 
    JOIN (SELECT @rownum := 0) r 
WHERE t.name = 'sarmen' 

Entonces usted puede seleccionar qué filas usted quiere, basado en el valor de rango.

+0

gracias, ¿cómo se llama este tipo de consulta? Me gustaría aprender más al respecto – eminem

+0

intenté esto, pero la columna de rango virtual llegó fuera nulo. tal vez puedo hacer una consulta y agregar cada fila a una matriz y obtener el 0 ° elemento? (usando php) – eminem

+0

@eminem: Consulta actualizada, inténtalo ahora. En cuanto a aprender esto, este es un truco hasta que MySQL sea compatible con las funciones de análisis/rango/ventanas. –

0

Usted puede obtener el número total de filas que contienen un nombre específico usando:

SELECT COUNT(*) FROM tbl_foo WHERE name = 'sarmen' 

Teniendo en cuenta el conteo, ahora se puede conseguir la enésima fila usando:

SELECT * FROM tbl_foo WHERE name = 'sarmen' LIMIT (n - 1), 1 

Donde 1 < = n < = COUNT (*) desde la primera consulta.

Ejemplo:

conseguir la tercera fila

SELECT * FROM tbl_foo WHERE name = 'sarmen' LIMIT 2, 1 
Cuestiones relacionadas