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

GROUP BY en varios SELECT con UNION

Estas en el tema de GROUP BY en varios SELECT con UNION en el foro de Mysql en Foros del Web. Hola. La meta es no mostrar resultados repetidos en función del campo "id_coche". Tengo estos 4 SELECT colocados en este orden exacto para que muestre ...
  #1 (permalink)  
Antiguo 28/01/2014, 11:16
 
Fecha de Ingreso: noviembre-2013
Mensajes: 27
Antigüedad: 10 años, 5 meses
Puntos: 1
GROUP BY en varios SELECT con UNION

Hola.

La meta es no mostrar resultados repetidos en función del campo "id_coche".

Tengo estos 4 SELECT colocados en este orden exacto para que muestre los resultados del primer SELECT en primer lugar y me los ordene por velocidad, luego los del segundo y así sucesivamente:

Código MySQL:
Ver original
  1. (SELECT * FROM table WHERE coches LIKE "nuevos" ORDER BY velocidad LIMIT 100)
  2. (SELECT * FROM table WHERE coches LIKE "semi-nuevos" ORDER BY velocidad LIMIT 100)
  3. (SELECT * FROM table WHERE coches LIKE "viejos" ORDER BY velocidad LIMIT 100)
  4. (SELECT * FROM table WHERE coches LIKE "raros" ORDER BY velocidad LIMIT 100)
  5. LIMIT 100

Pero si quiero usar un "GROUP BY id_coche" al final del todo no funciona y si lo aplico en cada consulta individual me muestra resultados repetidos igualmente y no funciona.

También probé a usar Distint, ejemplo:

Código MySQL:
Ver original
  1. (SELECT DISTINT id_coche FROM table WHERE coches LIKE "nuevos" ORDER BY velocidad LIMIT 100)
  2. (SELECT DISTINT id_coche FROM table WHERE coches LIKE "semi-nuevos" ORDER BY velocidad LIMIT 100)
  3. (SELECT DISTINT id_coche FROM table WHERE coches LIKE "viejos" ORDER BY velocidad LIMIT 100)
  4. (SELECT DISTINT id_coche FROM table WHERE coches LIKE "raros" ORDER BY velocidad LIMIT 100)
  5. LIMIT 100

Pero necesito todos los campos y únicamente quiero que no se repita ese, los demás si es necesario que se repitan.

¿Alguna idea?
  #2 (permalink)  
Antiguo 29/01/2014, 03:24
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: GROUP BY en varios SELECT con UNION

Con un group by tampoco lo solucionas, si necesitas el resto de campos....

id_coche, campo2
1,A
1,B

que valor del campo2 quieres ver para el coche 1?

Muestra la definición de la o las tablas sobre las que haces la query.... para intentar entender la situación.


Por otro lado: coches LIKE "un lietral sin comodines".... es mejor usar coches="un lietral"
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 29/01/2014, 04:51
 
Fecha de Ingreso: noviembre-2013
Mensajes: 27
Antigüedad: 10 años, 5 meses
Puntos: 1
Respuesta: GROUP BY en varios SELECT con UNION

Cita:
Iniciado por quimfv Ver Mensaje
Muestra la definición de la o las tablas sobre las que haces la query.... para intentar entender la situación.
La tabla "vehiculos" es algo así:

id_coche---------------coche------------------velocidad
BMW4-------------------nuevos--------------------150
Audi 5-----------------semi-nuevos------------------120
Mercedes 3---------------viejos----------------------85
Opel 4-------------------nuevos--------------------136
Audi 5---------------------raros----------------------44


Cita:
Iniciado por quimfv Ver Mensaje
que valor del campo2 quieres ver para el coche 1?
La verdad es no entiendo lo que me quieres decir.

Y en esto otro:
Cita:
Iniciado por quimfv Ver Mensaje
Por otro lado: coches LIKE "un lietral sin comodines".... es mejor usar coches="un lietral"
¿Por qué?

Última edición por juanito_29899; 29/01/2014 a las 05:28
  #4 (permalink)  
Antiguo 29/01/2014, 05:44
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, 4 meses
Puntos: 2658
Respuesta: GROUP BY en varios SELECT con UNION

Respecto al LIKE: porque
Código SQL:
Ver original
  1. campo LIKE 'valor'
es semanticamente idéntico a
Código SQL:
Ver original
  1. campo = 'valor'
pero internamente usan diferentes algoritmos, y en este caso, LIKE resulta ineficiente..
LIKE se usa para búsquedas por proximidad, con comodines, y tu estas buscando un valor preciso, es decir igualdad, por ello corresponde usar "=".
__________________
¿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/01/2014, 05:49
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: GROUP BY en varios SELECT con UNION

Cita:
La tabla "vehiculos" es algo así:

id_coche---------------coche------------------velocidad
BMW4-------------------nuevos--------------------150
Audi 5-----------------semi-nuevos------------------120
Mercedes 3---------------viejos----------------------85
Opel 4-------------------nuevos--------------------136
Audi 5---------------------raros----------------------44


Cita: Iniciado por quimfv Ver Mensaje
que valor del campo2 quieres ver para el coche 1?

La verdad es no entiendo lo que me quieres decir.
Con tus datos de ejemplo

Para id_coche="Audi 5" que datos se deben mostrar de los otros campos....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #6 (permalink)  
Antiguo 29/01/2014, 06:31
 
Fecha de Ingreso: noviembre-2013
Mensajes: 27
Antigüedad: 10 años, 5 meses
Puntos: 1
Respuesta: GROUP BY en varios SELECT con UNION

Es decir, que usar el símbolo = en lugar de LIKE consume menos recursos. ¿Y cuando use Match Against también uso el igual? Es que como has mencionado lo de la proximidad.

Cita:
Iniciado por quimfv Ver Mensaje
Con tus datos de ejemplo

Para id_coche="Audi 5" que datos se deben mostrar de los otros campos....
La verdad es que me cuesta entenderte. Te pido disculpas. Si te refieres a que resultado se debería mostrar teniendo en cuenta la tabla que he puesto sería este (que es lo que quiero):

Audi 5 --- semi-nuevos --- 120

¿Por qué?

Porque se preferencia por "lo más nuevo", en este caso es "semi-nuevo" porque no hay otro más nuevo en la tabla y sólo debe mostrarse ese resultado ya que Audi 5 hay otro.

Te he puesto esa respuesta pero ni si quiera sé si era esa tu pregunta. Tal vez estoy respondiendo algo totalmente diferente.
  #7 (permalink)  
Antiguo 29/01/2014, 07:20
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: GROUP BY en varios SELECT con UNION

Primera parte

Cita:
Es decir, que usar el símbolo = en lugar de LIKE consume menos recursos. ¿Y cuando use Match Against también uso el igual? Es que como has mencionado lo de la proximidad.
Te respondo yo, si a la primara parte y no a la segunda

Del manual de mysql...

Código pre:
Ver original
  1. mysql> SELECT id, body, MATCH (title,body) AGAINST
  2.     -> ('Security implications of running MySQL as root'
  3.     -> IN NATURAL LANGUAGE MODE) AS score
  4.     -> FROM articles WHERE MATCH (title,body) AGAINST
  5.     -> ('Security implications of running MySQL as root'
  6.     -> IN NATURAL LANGUAGE MODE);
  7. +----+-------------------------------------+-----------------+
  8. | id | body                                | score           |
  9. +----+-------------------------------------+-----------------+
  10. |  4 | 1. Never run mysqld as root. 2. ... | 1.5219271183014 |
  11. |  6 | When configured properly, MySQL ... | 1.3114095926285 |
  12. +----+-------------------------------------+-----------------+
  13. 2 rows in set (0.00 sec)

No suelo usar ese tipo de indices pero donde vas a poner el igual o el like....


Segunda parte

Si era exactamente esa mi pregunta, y fijate que era una información que aún no habías dado.

De entrada usaria un condicional para convertir las categorias a algo ordenable

Por ejemplo

nuevo=1
semi-nuevos=2
viejos=3
raros=4

if(coche="nuevo",1,if(coche="semi-nuevos",2,if(coche="viejo",3,4))) as antiguedad

Luego podriamos hacer lo siguiente

Código MySQL:
Ver original
  1. SELECT id_coche,
  2. MIN(if(coche="nuevo",1,if(coche="semi-nuevos",2,if(coche="viejo",3,4))))  as antiguedad
  3. GROUP BY id_coche;

id_coche---------------antiguedad
BMW4-------------------1
Audi 5-----------------2
Mercedes 3---------------3
Opel 4-------------------1

ya tendriamos algo.... con tus datos de ejemplo esta claro que obtenemos el audi 5/semi-uevos/120

pero y si hay mas de un Audi 5/semi-uevos luego quieres el mas rápido?

Ahora deberias explicar como se entiende esto

Código MySQL:
Ver original
  1. (SELECT....LIMIT 100)
  2. (SELECT....LIMIT 100)
  3. (SELECT....LIMIT 100)
  4. LIMIT 100

Si del primer select salen cien registros no obtendrás ninguno del segundo....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #8 (permalink)  
Antiguo 29/01/2014, 07:37
 
Fecha de Ingreso: noviembre-2013
Mensajes: 27
Antigüedad: 10 años, 5 meses
Puntos: 1
Respuesta: GROUP BY en varios SELECT con UNION

Cita:
Ahora deberias explicar como se entiende esto
Exacto, porque si con el primer SELECT ya obtengo los 100 registros que quiero no necesito ninguno más, ya que los primeros son los más relevantes (porque yo los quiero priorizar así), de ahí el LIMIT. Sin embargo si por ejemplo el primer SELECT sólo me da 80 resultados, al no haber llegado al límite de 100 aún quiero que me siga dando resultados con el segundo SELECT, y así con todos. En ese sentido no tengo ningún problema.

Si en realidad lo tengo "chapuceramente" arreglado con PHP, es decir, usando NOT LIKE. Pero eso implica mucho código y además quiero hacerlo con MySQL exclusivamente, si es que se puede...

Y por otro lado lo de Nuevo, seminuevo, viejo... En realidad es sólo un ejemplo pero ahí están keywords del vehículo. Ej:

"Viejo, Seminuevo, motor quemado, ruedas tamaño XL".

He puesto palabras aposta para poner un ejemplo de TEXTO reducido porque, obviamente, si sólo existiesen esos 4 tipos o un número definido, lo habría hecho con número, como la velocidad. Por lo tanto los IF me parece que no me sirven al tratarse de texto.

¿No sé le puede dar un valor numérico a cada SELECT para ponerlos todos juntos, con los UNION pero sin los paréntesis de cada SELECT y al final hacer un ORDER BY select_score, velocidad o lo que sea + el GROUP BY? Me parece que el GROUP BY en ese caso si funcionaría al no tener SELECTs individuales separados con los paréntesis.

También he comprobado que si uso un GROUP BY en un sólo SELECT que sea con MATCH AGAINST aparte, independientemente de todos estos códigos mencionados, la relevancia falla. No entiendo por que...

Última edición por juanito_29899; 29/01/2014 a las 12:07

Etiquetas: campo, group, select, union
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 07:48.