Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Select distinct

Estas en el tema de Select distinct en el foro de Mysql en Foros del Web. hola a todos ante todo deciros que estoy empezando con mysql y daros las gracias por adelantado tengo una tabla de especies de peces con ...
  #1 (permalink)  
Antiguo 29/11/2009, 10:11
 
Fecha de Ingreso: noviembre-2009
Mensajes: 7
Antigüedad: 14 años, 5 meses
Puntos: 0
Select distinct

hola a todos ante todo deciros que estoy empezando con mysql y daros las gracias por adelantado
tengo una tabla de especies de peces con sus kg cm y otras características estoy intentando hacer una consulta en la cual me recupere los datos de la tabla ordenado por especie pero en la cual no se repita ninguna especie si lo intento solo con un campo no hay problema

SELECT distinct records.id_especie
FROM records

el problema lo tengo cuando quiero que me muestre todos los datos pero que no me repita las especies

SELECT distinct records.id_especie, records.kg, records.cm, records.imajen
FROM records
ORDER BY records.kg
que es lo que hago mal luego le e añadido un ORDER BY para que me muestre los que mas kg tengan
muchas gracias por adelantado
  #2 (permalink)  
Antiguo 29/11/2009, 10:39
 
Fecha de Ingreso: mayo-2007
Mensajes: 60
Antigüedad: 17 años
Puntos: 3
Respuesta: Select distinct

el distinct se usa por que tienes registros duplicados, necesitas un group by para agrupar los registros y los campos que quieres seleccionar.
  #3 (permalink)  
Antiguo 29/11/2009, 11:05
 
Fecha de Ingreso: noviembre-2009
Mensajes: 7
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: Select distinct

Cita:
Iniciado por aaronaaron Ver Mensaje
el distinct se usa por que tienes registros duplicados, necesitas un group by para agrupar los registros y los campos que quieres seleccionar.

no se si te e entendido muy bien lo promero darte las gracias y decirte que me salte una linea de mi codigo te pongo de nuebo el codigo


SELECT distinct records.id_especie, records.kg, records.cm, records.imajen
FROM records
ORDER BY especies.especie, records.kg DESC


como ves primero lo ordeno por especies y luego por kg lo que hace esto es mostrar todos los campos o sea no me elimina ninguno y yo quisiera que por ejemplo si hay 20 datos que contengan atún solo me muestre el primero que se supone que esta filtrado por kg no se si me e explicado bien
  #4 (permalink)  
Antiguo 29/11/2009, 13:48
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Select distinct

Para eso debes hacer lo que aronaaron te dice: debes agrupar por el valor que deseas que diversifique.
Cuando pones DISTINCT, lo que le dices es que devuelva los registros donde el conjunto comprendido por los campos soliciatados en el SELECT sea distinto al menos en un valor. Si tienes 28 registros de atún, todos del mismo peso, pero diferentes longitudes, son 28 registros distintos. Para que los considere uno sólo deberían ser todos del mismo largo.
La solución es el agrupamiento por el tipo de pez:
Código SQL:
Ver original
  1. SELECT DISTINCT
  2.     R.id_especie,
  3.     R.kg, records.cm,
  4.     R.imajen
  5. FROM records R
  6. ORDER BY especie, kg DESC
  7. GROUP BY especie;

Detalle: Estás invocando especie.especie, lo que implicaría que estás haciendo un JOIN con una tabla denominada "especie", que no aparece en la sentencia. Eso debe dar un error de sintaxis.
Revisa...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 29/11/2009, 14:38
 
Fecha de Ingreso: noviembre-2009
Mensajes: 7
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: Select distinct

perdonar mi torpeza de nuevo por simplificar no puse todas las lineas efectibamente asi me daria error copi todo el codigo
Cita:
SELECT DISTINCT
records.id_especie,
records.id_socio, records.id_pantano, records.kg, records.cm, records.imajen, usuarios.usuario_id, usuarios.nombre_usuario, pantano.id, pantano.pantano, especies.id, especies.especie
FROM records, usuarios, pantano, especies
WHERE records.id_socio=usuarios.usuario_id AND records.id_especie=especies.id AND records.id_pantano=pantano.id
ORDER BY records.id_especie, records.kg
no e entendido muy bien lo que me comentais me imagino que cuando dices R.id_especie, te refieres a records.id, o no es asi como tu dices son con diferente peso longitud y lo que quiero que me muestre solo un atun el que mas kg tenga y solo un tiburon etc en este caso lo agrupe por especie.id
tambien lo intente de esta manera pero nada

Cita:
SELECT DISTINCT
records.id_especie,
records.id_socio, records.id_pantano, records.kg, records.cm, records.imajen, usuarios.usuario_id, usuarios.nombre_usuario, pantano.id, pantano.pantano, especies.id, especies.especie
FROM records, usuarios, pantano, especies
WHERE records.id_socio=usuarios.usuario_id AND records.id_especie=especies.id AND records.id_pantano=pantano.id
ORDER BY records.id_especie, records.kg
GROUP BY records.id_especie
me da sintasis de error
  #6 (permalink)  
Antiguo 29/11/2009, 14:58
 
Fecha de Ingreso: noviembre-2009
Mensajes: 7
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: Select distinct

DESPUES Ddespues de trastear un poco e consegido que me agrupe por id_especie pero no me ordena por kg o sea me coge el registro primero que hay en la bd y yo quisiera que me cogiera el que mas kg tengaos pego el codigo haber si algien sabe como solucionarlo muchas gracias por anticipado

Cita:
SELECT DISTINCT records.id_especie, records.id_socio, records.id_pantano, records.kg, records.cm, records.imajen, usuarios.usuario_id, usuarios.nombre_usuario, pantano.id, pantano.pantano, especies.id, especies.especie, especies.especie
FROM records, usuarios, pantano, especies
WHERE records.id_socio=usuarios.usuario_id AND records.id_especie=especies.id AND records.id_pantano=pantano.id
GROUP BY records.id_especie
ORDER BY records.kg DESC
  #7 (permalink)  
Antiguo 29/11/2009, 15:36
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Select distinct

Vamos por partes:
- El uso de P en lugar de la tabla es porque cuando tienes nombres largos que debes repetir constantemente en los campos usados para consultas, especialmente al usar JOINS, es conveniente el uso de alias, que se declaran en el FROM, sea usando la cláusula AS, como simplemente adjuntando el nombre de alias a continuación. También se pueden declarar los alias en el SELECT para los campos usados (ver este ejemplo).
- Si vas a hacer un JOIN de tablas, las relaciones deben ponerse preferentemente en el FROM a través del JOIN (la coma es su sinónimo) respectivo y con la cláusula ON. Esto es así porque el parser de MySQL no puede optimizar la lectura de tablas si estas condiciones están el el WHERE, y sí lo puede hacer si están en el FROM.
- El orden de GROUP BY y ORDER BY es único. Si los pones al revés te dará un error de sintaxis. En tu caso, para lograr lo que quieres, debes hacer uso de una función agrupada más: MAX().
- El ORDER BY debe contener los campos en el mismo orden en que se espera ordenar. En tu caso hay que ordenar la especie primero, o te las mezclará, y luego el peso. Imagina que es una tabla de Excel. La lógica es la misma.
- Cuando tengas dudas de sintaxis, o quieras saber para qué se usan las cláusulas, o el roden de las mismas, dale una leída al manual de referencia de MySQL. La mayor parte de las respuestas están allí. Ten paciencia para leerlo: MySQL 5.0 Reference Manual

Código SQL:
Ver original
  1. SELECT DISTINCT
  2.   R.id_especie,
  3.   R.id_socio,
  4.   R.id_pantano,
  5.   MAX(R.kg) kg,
  6.   R.cm,
  7.   R.imajen,
  8.   U.usuario_id,
  9.   U.nombre_usuario,
  10.   P.id,
  11.   P.pantano,
  12.   E.id,
  13.   E.especie,
  14.   E.especie
  15. FROM records R
  16.   INNER JOIN usuarios U ON R.id_socio = U.usuario_id
  17.   INNER JOIN pantano P ON R.id_pantano = P.id
  18.   INNER JOIN especies E ON R.id_especie=E.id
  19. GROUP BY R.id_especie
  20. ORDER BY R.id_especie;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 30/11/2009, 10:58
 
Fecha de Ingreso: noviembre-2009
Mensajes: 7
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: Select distinct

ante todo daros las gracias a todo por contestar estuve mirando barios tutoriales pero no lei nada al respecto le voy a echar un vistazo al manual muchas gracias de nuevo la consulta funciona perfecta
  #9 (permalink)  
Antiguo 30/11/2009, 16:37
 
Fecha de Ingreso: noviembre-2009
Mensajes: 7
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: Select distinct

perdonar que os moleste pero al introducir mas datos me e encontrado con la sorpresa de que me mezcla los campos es decir me coge la especie el peso y lo de mas no es lo que corresponde esta mezclado con todos los registros e estado mirando el manual pero no me aclaro mucho si me pudieseis explicar os lo agradecería
  #10 (permalink)  
Antiguo 30/11/2009, 16:55
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Select distinct

Postea la tabla resultado (lo que la consulta te responde) para ver qué es lo que dices te da, junto con la consulta tal y como la estás usando.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 30/11/2009, 17:49
 
Fecha de Ingreso: noviembre-2009
Mensajes: 7
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: Select distinct

la consulta que yo hago es esta


Cita:
SELECT DISTINCT
R.id_records,
R.especie_id,
R.socio_id,
R.pantano_id,
MAX(R.kg) kg,
R.cm, R.imajen,
U.usuario_id,
U.nombre_usuario,
P.id_pantano,
P.pantano,
E.id_especie,
E.especie
FROM records R INNER JOIN usuarios U ON R.socio_id = U.usuario_id INNER JOIN pantano P ON R.pantano_id = P.id_pantano INNER JOIN especies E ON R.especie_id=E.id_especie
GROUP BY R.especie_id
ORDER BY R.especie_id
esto es lo que me debuelbe

Cita:
1 /2/4 /18 /4/ 3.35/ 4/ nuria /4 /mequinenza /24/ lucio
4 /25 /18 /3/ 0.98/ 0.48/ nuria /3/ garcia sola/ 25/ bass
y estos son los registros metidos en la base de datos

Cita:
1 /18 /24/ 4/ 3/ 4/ 18/ nuria/ 4 /mequinenza /24/ lucio
2 /17 /24/ 3 /3.35/ 4.25/ 17/ busti /3 /garcia sola/ 24/ lucio
3 /19/ 24/ 4/0 /0 /19/ toni /4 /mequinenza/ 24 /lucio
4 /18 /25 /3/ 0.98 /0.48 /18/ nuria/ 3/ garcia sola/25/ bass
5 /15 /24 /1/ 2.45/ 53/ 15/ yoni /1/ cijara /24 /lucio
logicamente como solo hay un bass en especie ese sale bien pero con lucio me mezcla los datos me deberia salir el que tiene el peso mayor

Cita:
2 /17 /24/ 3 /3.35/ 4.25/ 17/ busti /3 /garcia sola/ 24/ lucio
pero no me sale me imagino que es por que lo agrupe por R.especie_id y agrupo todos los registros mezclandolos e intentado 500 cosas pero todas me an fallado o sale igual o me buelbe a salir todos los registros
  #12 (permalink)  
Antiguo 30/11/2009, 21:37
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Select distinct

El problema es el ordenamiento: Debe realizarse antes de hacer el agrupamiento, para que de esa forma los valores mayores de peso se coloquen arriba.
El problema es que no se puede invertir la posición del GROUP BY y ORDER BY o de lo contrario daría un error de sintaxis, pero de todos modos la solución es simple, aunque molesta de escribir: Hay que realizar el ordenamiento en una subconsulta y el agrupamiento por fuera:
Código SQL:
Ver original
  1. SELECT
  2.   id_especie,
  3.   id_socio,
  4.   id_pantano,
  5.   kg,
  6.   cm,
  7.   imajen,
  8.   nombre_usuario,
  9.   pantano,
  10.   especie
  11. FROM
  12.   (SELECT DISTINCT
  13.     R.id_especie,
  14.     R.id_socio,
  15.     R.id_pantano,
  16.     R.kg,
  17.     R.cm,
  18.     R.imajen,
  19.     U.nombre_usuario,
  20.     P.pantano,
  21.     E.especie
  22.   FROM records R
  23.     INNER JOIN usuarios U ON R.id_socio = U.usuario_id
  24.     INNER JOIN pantano P ON R.id_pantano = P.id
  25.     INNER JOIN especies E ON R.id_especie=E.id
  26.   ORDER BY R.id_especie ASC, R.kg DESC, U.usuario_id ASC) T1
  27. GROUP BY id_especie;
Notarás tres cosas:
1. Eliminé algunos campos de los que habías colocado. Esto es porque son redundantes: Si pones el R.id_socio, ¿para qué poner el U.usuario_id? Es el mismo número y representa el mismo dato. Lo mismo pasa con E.id, P.id_pantano, y otros.
2. No estoy poniendo los alias en el SELECT exterior. Esto se debe a que esos alias mueren dentro de la subconsulta. En la exterior correspondería (si quisieras) T1, ya que ese es el alias de la tabla derivada (la generada por la subconsulta).
3. Estoy poniendo más campos como ordenamiento, y a cada uno le doy un ordenamiento distinto. Esto lo hago para que el primer registro que aparezca, y sobre el que se agruparán los restantes, sea el de mayor peso, pero que tanto los ID de la especie y el de los usuarios se ordenen de menor a mayor, previendo que dos usuarios se correspondan con el mismo pez, y éste posea el mismo peso (improbable, pero no imposible).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:10.