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

Tomar el id mínimo de un campo

Estas en el tema de Tomar el id mínimo de un campo en el foro de Mysql en Foros del Web. Hola buenos días. Yo de nuevo con uno de mis problemas y vengo aquí pues me han ayudado mucho y gracias a eso he avanzado ...

  #1 (permalink)  
Antiguo 23/05/2015, 08:01
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Tomar el id mínimo de un campo

Hola buenos días.

Yo de nuevo con uno de mis problemas y vengo aquí pues me han ayudado mucho y gracias a eso he avanzado con mi proyecto.

Pero ahora tengo un problema que no me esperaba.

Lo que pasa es que necesito tomar el valor mínimo de los últimos registros que sean iguales.

Ejemplo:
Código MySQL:
Ver original
  1. id     |   cliente     |      fecha
  2. ------------------------------
  3. 1    |    v1        |       2015-05-20
  4. 2    |    v1        |       2015-05-20
  5. 3    |    v1        |       2015-05-01
  6. 4    |    v1        |       2015-03-05
  7. 5    |    v2        |       2015-02-02
  8. 6    |    v3        |      2015-01-30
  9. 7    |    v1        |       2015-01-01

Me explico: Tengo esa tabla y quiero la fecha del último cliente en este caso es v1 y sí me muestra el último cliente con el id 1 pero no quiero ese, quiero la fecha del último cliente pero en su primer movimiento, pero cuando hago la consulta me sale el id 7.

Yo lo que en verdad necesito es, en este ejemplo, el id 4 pues es el primer movimiento que se hizo del último cliente... Pero no sé cómo hacerlo

Esta es la consulta que utilizo:

Código MySQL:
Ver original
  1. SELECT traslado.*, cliente.alias FROM traslado
  2.  
  3. INNER JOIN servicio
  4. ON traslado.servicio_id = servicio.servicio_id
  5.  
  6. INNER JOIN cliente
  7. ON servicio.cliente_id = cliente.cliente_id
  8.  
  9. WHERE remolque_otros ="'.$_GET['s'].'" AND cliente.alias = "'.$Dias1.'"
  10.  
  11.  
  12. GROUP BY cliente.alias ORDER BY fecha_servicio ASC LIMIT 1
[/CODE]

Sí alguien pudiera ayudarme se lo agradecería mucho

Última edición por gnzsoloyo; 23/05/2015 a las 22:18
  #2 (permalink)  
Antiguo 25/05/2015, 13:41
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Tomar el id mínimo de un campo

Código MySQL:
Ver original
  1. select max(fecha), cliente from tabla group by cliente
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 25/05/2015, 15:42
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Respuesta: Tomar el id mínimo de un campo

Hola Libras.

Estoy tratando de hacer el script y esto es lo que he hecho:

Código MySQL:
Ver original
  1. SELECT tt.*  FROM traslado tt
  2.  
  3. INNER JOIN servicio
  4. ON tt.servicio_id = servicio.servicio_id
  5.  
  6. INNER JOIN cliente
  7. ON servicio.cliente_id = cliente.cliente_id
  8.  
  9.         (
  10.             SELECT cliente.alias, cliente.cliente_id, traslado.traslado_id min_val
  11.             FROM    traslado
  12.             INNER JOIN servicio
  13. ON traslado.servicio_id = servicio.servicio_id
  14.  
  15. INNER JOIN cliente
  16. ON servicio.cliente_id = cliente.cliente_id
  17.             GROUP   BY remolque_otros, cliente.alias
  18.            
  19.         ) b  ON cliente.alias = b.alias AND
  20.                 cliente.cliente_id = b.cliente_id AND
  21.                 tt.traslado_id != b.min_val
  22.                 WHERE cliente.alias = "'.$Dias1.'" AND tt.remolque_otros = "'.$_GET['s'].'"  LIMIT 1,1

A continuación muestro las tablas que estoy utilizando aunque son sólo un pequeño ejemplo de lo que estoy usando en realidad. La tabla principal es la de "traslado", que se conecta con la tabla "servicio" que se conecta con la tabla "cliente".

Código:
mysql> select traslado_id, servicio_id, fecha_servicio, remolque_otros from tras
lado limit 5;
+-------------+-------------+---------------------+----------------+
| traslado_id | servicio_id | fecha_servicio      | remolque_otros |
+-------------+-------------+---------------------+----------------+
|     1057967 |     1106746 | 2012-01-02 06:35:23 | 2816           |
|     1057968 |     1106747 | 2012-01-02 06:35:55 | 2816           |
|     1057969 |     1106748 | 2012-01-02 06:36:11 | 48789          |
|     1057970 |     1106749 | 2012-01-02 06:37:27 | ***            |
|     1057971 |     1106750 | 2012-01-02 06:37:59 | ***            |
+-------------+-------------+---------------------+----------------+
5 rows in set (0.00 sec)

mysql> select servicio_id, cliente_id from servicio limit 5;
+-------------+------------+
| servicio_id | cliente_id |
+-------------+------------+
|      730645 |          5 |
|      730646 |          5 |
|      730690 |          5 |
|      730716 |          5 |
|      730717 |          5 |
+-------------+------------+
5 rows in set (0.00 sec)

mysql> select cliente_id, alias from cliente limit 5;
+------------+------------+
| cliente_id | alias      |
+------------+------------+
|        182 | 5J EXPRESS |
|         -1 | <Todos>    |
|         33 | ACC        |
|        268 | ACC DGO.   |
|        406 | ACCEL      |
+------------+------------+
5 rows in set (0.00 sec)
De aquí tengo qué sacar algo como lo muestro en este ejemplo:

Código:
id     |   cliente     |      fecha
------------------------------
7    |    v1        |       2015-05-20
6    |    v1        |       2015-05-20
5    |    v1        |       2015-05-01
4    |    v1        |       2015-03-05
3    |    v2        |       2015-02-02
2    |    v3        |      2015-01-30
1    |    v1        |       2015-01-01
La tabla anterior es sólo un ejemplo de lo que quiero hacer (he corregido los id).

Necesito sacar el cliente que se encuentre en el último registro y que me muestre la fecha, pero si ven tengo a "v1" como último cliente, pero no me interesa el id 7 pues necesito el primer movimiento de dicho cliente que es cuando empezó a usar nuestro servicio, en este caso es el id 4.

Al tratar de agrupar a los clientes lo único que logro es que me dé el id 1 que es su primer movimiento, pero yo necesito desde cuándo ese cliente empezó a usar nuestros servicios a la fecha.

gracias por adelantado.

Última edición por gnzsoloyo; 26/05/2015 a las 09:48
  #4 (permalink)  
Antiguo 25/05/2015, 15:54
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Tomar el id mínimo de un campo

es como te dije con una funcion de agregado aqui el ejemplo en sql server, que creo ocuparias la misma sintaxis para mysql

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. id INT,
  4. cliente VARCHAR(20),
  5. fecha datetime
  6. )
  7.  
  8. INSERT INTO #temp VALUES (7     ,   'v1'        ,       '2015-05-20')
  9. INSERT INTO #temp VALUES (6     ,   'v1'        ,       '2015-05-20')
  10. INSERT INTO #temp VALUES (5     ,   'v1'        ,       '2015-05-01')
  11. INSERT INTO #temp VALUES (4     ,   'v1'        ,       '2015-03-05')
  12. INSERT INTO #temp VALUES (3     ,   'v2'        ,       '2015-02-02')
  13. INSERT INTO #temp VALUES (2     ,   'v3'        ,      '2015-01-30')
  14. INSERT INTO #temp VALUES (1    ,    'v1'        ,       '2015-01-01')
  15.  
  16.  
  17. SELECT MIN(fecha), cliente FROM #temp GROUP BY cliente

Resultado:

(No column name) cliente
2015-01-01 00:00:00.000 v1
2015-02-02 00:00:00.000 v2
2015-01-30 00:00:00.000 v3


que es lo que busca sno???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 25/05/2015, 16:05
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Respuesta: Tomar el id mínimo de un campo

Hola Libras.

Lamentablemente no es lo que busco, el resultado que me das es este:


(No column name) cliente
2015-01-01 00:00:00.000 v1
2015-02-02 00:00:00.000 v2
2015-01-30 00:00:00.000 v3

El resultado que está dando es la del id 1. Yo necesito que me de el primer movimiento del ultimo cliente.

id | cliente | fecha
------------------------------
1 | v1 | 2015-05-20
2 | v1 | 2015-05-20
3 | v1 | 2015-05-01
4 | v1 | 2015-03-05 <----- busco este resultado
5 | v2 | 2015-02-02
6 | v3 | 2015-01-30
7 | v1 | 2015-01-01 <----- Este es el resultado que me esta dando

Como lo muestro arriba, el resultado que necesito es el id 4 porque es cuando se empezó a hacer los movimientos hasta la fecha actual.
  #6 (permalink)  
Antiguo 25/05/2015, 16:15
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Tomar el id mínimo de un campo

y en esos datos como se que es el ultimo cliente?? que campo uso para saber que necesitas el id 4 o como se eso???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 25/05/2015, 16:33
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Respuesta: Tomar el id mínimo de un campo

Bueno como dije anteriormente el código que utilizo es este:

Código MySQL:
Ver original
  1. SELECT tt.*  FROM traslado tt
  2.  
  3. INNER JOIN servicio
  4. ON tt.servicio_id = servicio.servicio_id
  5.  
  6. INNER JOIN cliente
  7. ON servicio.cliente_id = cliente.cliente_id
  8.  
  9.         (
  10.             SELECT cliente.alias, cliente.cliente_id, traslado.traslado_id min_val
  11.             FROM    traslado
  12.             INNER JOIN servicio
  13. ON traslado.servicio_id = servicio.servicio_id
  14.  
  15. INNER JOIN cliente
  16. ON servicio.cliente_id = cliente.cliente_id
  17.             GROUP   BY remolque_otros, cliente.alias
  18.            
  19.         ) b  ON cliente.alias = b.alias
  20.                 AND cliente.cliente_id = b.cliente_id
  21.                 AND tt.traslado_id != b.min_val
  22.                 WHERE cliente.alias = "'.$Dias1.'" AND tt.remolque_otros = "'.$_GET['s'].'"

Lo que en verdad quiero es contar los días que tiene un cliente con el vehículo de la empresa comparando la fecha del cliente con la fecha actual, lo que yo hacía era contar desde el último registro, por ejemplo:

id | cliente | fecha
------------------------------
7 | v1 | 2015-05-20 <---- este es el resultado que me daba
6 | v1 | 2015-05-20
5 | v1 | 2015-05-01
4 | v1 | 2015-03-05
3 | v2 | 2015-02-02
2 | v3 | 2015-01-30
1 | v1 | 2015-01-01

Pero después me di cuenta de que no debería de contar los días desde ese registro pues antes de que ese movimiento fuera insertado, el cliente ya había hecho movimientos y es eso lo que busco, por ejemplo:

id | cliente | fecha
------------------------------
7 | v1 | 2015-05-20
6 | v1 | 2015-05-20
5 | v1 | 2015-05-01
4 | v1 | 2015-03-05 <---- este es el resultado que necesito
3 | v2 | 2015-02-02
2 | v3 | 2015-01-30
1 | v1 | 2015-01-01

El error está en que cuando quiero agrupar por cliente (cliente.alias) y quiero mostrar el primer registro insertado se va hasta el último registro de ese cliente.

id | cliente | fecha
------------------------------
7 | v1 | 2015-05-20
6 | v1 | 2015-05-20
5 | v1 | 2015-05-01
4 | v1 | 2015-03-05
3 | v2 | 2015-02-02
2 | v3 | 2015-01-30
1 | v1 | 2015-01-01 <---- este es el resultado que obtengo pero no es el que busco

El campo donde están los nombres de los clientes es "cliente.alias" el campo fecha es "traslado.fecha_servicio" y el campo de id es "traslado.traslado_id"

No sé si me expliqué.

Última edición por gnzsoloyo; 26/05/2015 a las 09:47
  #8 (permalink)  
Antiguo 25/05/2015, 16:41
 
Fecha de Ingreso: febrero-2015
Mensajes: 89
Antigüedad: 9 años, 2 meses
Puntos: 1
Respuesta: Tomar el id mínimo de un campo

No entiendo.. porque el "primer movimiento de un cliente" tiene una fecha más alta que el último movimiento. cuando debería ser al revés.... al menos en tu ejemplo no le encuentro sentido.

Aparte de eso, se supone que la forma de identificar el último movimiento de todos es por el ID? o por la fecha?
... -_-


id | cliente | fecha
------------------------------
1 | v1 | 2015-05-20
2 | v1 | 2015-05-20
3 | v1 | 2015-05-01
4 | v1 | 2015-03-05 <----- busco este resultado
5 | v2 | 2015-02-02
6 | v3 | 2015-01-30
7 | v1 | 2015-01-01 <----- Este es el resultado que me esta dando
  #9 (permalink)  
Antiguo 25/05/2015, 16:51
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Respuesta: Tomar el id mínimo de un campo

Hola jmendezg

Desgraciadamente escribi mal la tabla y lo que fue peor es que la copié.

Esa tabla no le tomes importancia, ya más abajo está corregida.
  #10 (permalink)  
Antiguo 25/05/2015, 16:54
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Respuesta: Tomar el id mínimo de un campo

Que tal.

Estoy utilizando este script ahora. Pero me sale Resource id #12:

Código MySQL:
Ver original
  1. SELECT tt.*  FROM traslado tt
  2.  
  3. INNER JOIN servicio
  4. ON tt.servicio_id = servicio.servicio_id
  5.  
  6. INNER JOIN cliente
  7. ON servicio.cliente_id = cliente.cliente_id
  8.  
  9. (
  10.     SELECT MIN(fecha_servicio) as mindate, cliente.alias
  11.     from traslado
  12.     INNER JOIN servicio
  13. ON traslado.servicio_id = servicio.servicio_id
  14.  
  15. INNER JOIN cliente
  16. ON servicio.cliente_id = cliente.cliente_id
  17.     group by cliente.alias
  18. ) t2
  19.     ON cliente.alias = t2.alias
  20.     AND tt.fecha_servicio = t2.mindate
  21.    
  22.                 WHERE cliente.alias = "'.$Dias1.'" AND tt.remolque_otros = "'.$_GET['s'].'" '

Qué estoy haciendo mal
  #11 (permalink)  
Antiguo 25/05/2015, 17: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: Tomar el id mínimo de un campo

Bueno, con ese error lo que estás haciendo mal es preguntar en este foro...
Ese mensaje es de PHP, no de MySQL. Habría que verificar que significa en ese contexto antes de decir que es un problema de MySQL.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 26/05/2015, 08:36
 
Fecha de Ingreso: febrero-2015
Mensajes: 89
Antigüedad: 9 años, 2 meses
Puntos: 1
Respuesta: Tomar el id mínimo de un campo

Cita:
Iniciado por planmental Ver Mensaje
Hola jmendezg

Desgraciadamente escribi mal la tabla y lo que fue peor es que la copié.

Esa tabla no le tomes importancia, ya más abajo está corregida.
Sigo sin encontrarle sentido, porque abria que entregarte el id numero 4
si el primer movimiento del cliente v1 fue el que tiene el id 1?

Ya que el ultimo cliente que hizo movimientos fue el cliente con id 7... osea el v1.

id | cliente | fecha
------------------------------
7 | v1 | 2015-05-20
6 | v1 | 2015-05-20
5 | v1 | 2015-05-01
4 | v1 | 2015-03-05 <---- este es el resultado que necesito
3 | v2 | 2015-02-02
2 | v3 | 2015-01-30
1 | v1 | 2015-01-01

Disculpa, lo veo un poco sencillo pero tu explicación es lo que no entiendo :/.
  #13 (permalink)  
Antiguo 26/05/2015, 08: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: Tomar el id mínimo de un campo

Y si probamos....
Código MySQL:
Ver original
  1.     (SELECT tt.*  
  2.     FROM traslado T
  3.         INNER JOIN servicio S ON T.servicio_id = S.servicio_id
  4.         INNER JOIN cliente C ON S.cliente_id = C.cliente_id
  5.     WHERE
  6.             cliente.alias = "'.$Dias1.'"
  7.         AND tt.remolque_otros = "'.$_GET['s'].'"
  8.     ORDER BY S.fecha_servicio DESC, C.alias ASC) TT
  9. GROUP BY alias;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 26/05/2015, 09:34
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Respuesta: Tomar el id mínimo de un campo

Perdón por lo mal que lo expliqué

Dejen veo cómo puedo explicarme mejor, y hago borrón y cuenta nueva.
  #15 (permalink)  
Antiguo 26/05/2015, 09:41
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Respuesta: Tomar el id mínimo de un campo

Hola gnzsoloyo.

He usado tu código modificándolo de esta manera:
Código MySQL:
Ver original
  1.     (SELECT T.*  
  2.     FROM traslado T
  3.         INNER JOIN servicio S
  4.         ON T.servicio_id = S.servicio_id
  5.         INNER JOIN cliente C
  6.         ON S.cliente_id = C.cliente_id
  7.     WHERE
  8.             C.alias = "'.$Dias1.'"
  9.         AND T.remolque_otros = "'.$_GET['s'].'"
  10.     ORDER BY T.fecha_servicio ASC, C.alias DESC) TT
  11.        INNER JOIN servicio S
  12.         ON TT.servicio_id = S.servicio_id
  13.         INNER JOIN cliente C
  14.         ON S.cliente_id = C.cliente_id
  15. GROUP BY C.alias;

Desgraciadamente me sale el mismo resultado.
Estoy cambiando el order by a ver qué resultados me da.

PD: no sabía que se podía ordenar dos campos a la ves

Última edición por gnzsoloyo; 26/05/2015 a las 09:47 Razón: MUY MAL etiquetado.
  #16 (permalink)  
Antiguo 26/05/2015, 09:50
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Tomar el id mínimo de un campo

de nuevo la pregunta, cual es el criterio para decir que tiene que ser el id 4??? como te dijeron ese no es el primer movimiento del cliente....
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #17 (permalink)  
Antiguo 26/05/2015, 10:12
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: Tomar el id mínimo de un campo

Volvamos al principio:
Cita:
Iniciado por planmental Ver Mensaje
[...] necesito tomar el valor mínimo de los últimos registros que sean iguales.

Ejemplo:
Código MySQL:
Ver original
  1. id     |   cliente     |      fecha
  2. ------------------------------
  3. 1    |    v1        |       2015-05-20
  4. 2    |    v1        |       2015-05-20
  5. 3    |    v1        |       2015-05-01
  6. 4    |    v1        |       2015-03-05
  7. 5    |    v2        |       2015-02-02
  8. 6    |    v3        |      2015-01-30
  9. 7    |    v1        |       2015-01-01

Me explico: Tengo esa tabla y quiero la fecha del último cliente en este caso es v1 y sí me muestra el último cliente con el id 1 pero no quiero ese, quiero la fecha del último cliente pero en su primer movimiento, pero cuando hago la consulta me sale el id 7.
En ralidad debes razonarlo así:
1) necesitas determinar qué registros repiten valores completos, con exclusion del ID del registro.
Código MySQL:
Ver original
  1. SELECT   T.servicio_id, cliente_id, s.fecha_servicio
  2.     FROM traslado T
  3.          INNER JOIN servicio S ON T.servicio_id = S.servicio_id
  4.          INNER JOIN cliente C ON S.cliente_id = C.cliente_id
  5.    WHERE cliente.alias = "'.$Dias1.'"
  6.      AND tt.remolque_otros = "'.$_GET['s'].'"
  7. GROUP BY T.servicio_id, cliente_id, s.fecha_servicio
  8. HAVING COUNT(*) > 1;
2) Necesitas buscar de esos, el menor de todos, ordenado por cliente;
Código MySQL:
Ver original
  1. SELECT   servicio_id, cliente_id, MIN(fecha_servicio) fecha_servicio
  2.     FROM (SELECT  T.servicio_id, cliente_id, s.fecha_servicio
  3.             FROM traslado T
  4.                  INNER JOIN servicio S ON T.servicio_id = S.servicio_id
  5.                  INNER JOIN cliente C ON S.cliente_id = C.cliente_id
  6.            WHERE cliente.alias = "'.$Dias1.'"
  7.              AND tt.remolque_otros = "'.$_GET['s'].'"
  8.            GROUP BY T.servicio_id, cliente_id, s.fecha_servicio
  9.            HAVING COUNT(*) > 1) T1
  10. GROUP BY servicio_id, cliente_id;
3) Sobre la base d ela lista obtenida, se puede hacer una subconsulta que filtr lo buscado:
Código MySQL:
Ver original
  1. SELECT T.*  
  2. FROM traslado T
  3.      INNER JOIN servicio S ON T.servicio_id = S.servicio_id
  4.      INNER JOIN cliente C ON S.cliente_id = C.cliente_id
  5.      cliente.alias = "'.$Dias1.'"
  6.     AND tt.remolque_otros = "'.$_GET['s'].'"
  7.     AND (T.servicio_id, cliente_id, s.fecha_servicio) IN
  8.         (SELECT   servicio_id, cliente_id, MIN(fecha_servicio) fecha_servicio
  9.             FROM (SELECT  T.servicio_id, cliente_id, s.fecha_servicio
  10.                      FROM traslado T
  11.                           INNER JOIN servicio S ON T.servicio_id = S.servicio_id
  12.                           INNER JOIN cliente C ON S.cliente_id = C.cliente_id
  13.                     WHERE cliente.alias = "'.$Dias1.'"
  14.                       AND tt.remolque_otros = "'.$_GET['s'].'"
  15.                     GROUP BY T.servicio_id, cliente_id, s.fecha_servicio
  16.                     HAVING COUNT(*) > 1) T1
  17.     GROUP BY servicio_id, cliente_id);

La idea central es que vayas resolviendo el problema en etapas. Sin intentas resolverlo todo de un sólo paso no vas a poder. erminarás con codigos confusos y resultados erráticos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #18 (permalink)  
Antiguo 26/05/2015, 10:17
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Respuesta: Tomar el id mínimo de un campo

Hola gnzsoloyo.

Te aventaste jaja.

Voy a ir probando lo que me estás mostrando que la verdad sí es bastante.

Me eliminaron el tema nuevo que había hecho donde por fin me había explicado bien

Voy a probarlo y comentaré mi resultado.

Gracias.
  #19 (permalink)  
Antiguo 26/05/2015, 10:20
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: Tomar el id mínimo de un campo

Lo eliminé porque las PDU de FDW dicen explicitamente que no se deben abrir múltiples hilos para un mismo tema. De haber querido hacer una explicación mas clara la deberías haber puesto en este mismo tema, resaltandola de algún modo.
No te lo tomes personal, porque ese borrado lo realizo en TODOS casos que se presenta.

Ten en cuenta ese detalle para evitar perdidas de mensajes en el futuro. Serán eliminaods sin previo aviso, o fusionados con el principal. Pero dado que el principal ya había avanzado demasiado, no podía hacer la fusión.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #20 (permalink)  
Antiguo 26/05/2015, 10:27
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Respuesta: Tomar el id mínimo de un campo

Ups sorry no los sabía.

Y bueno he hecho lo que me has puesto y pues modifiqué unas cosas y me quedó así

Código MySQL:
Ver original
  1. SELECT T.*  
  2. FROM traslado T
  3.      INNER JOIN servicio S ON T.servicio_id = S.servicio_id
  4.      INNER JOIN cliente C ON S.cliente_id = C.cliente_id
  5.      C.alias = "'.$Dias1.'"
  6.     AND T.remolque_otros = "'.$_GET['s'].'"
  7.     AND (T.servicio_id, C.cliente_id, T.fecha_servicio) IN
  8.         (SELECT   servicio_id, C.cliente_id, MIN(fecha_servicio) fecha_servicio
  9.             FROM (SELECT  T.servicio_id,C. cliente_id, T.fecha_servicio
  10.                      FROM traslado T
  11.                           INNER JOIN servicio S ON T.servicio_id = S.servicio_id
  12.                           INNER JOIN cliente C ON S.cliente_id = C.cliente_id
  13.                     WHERE C.alias = "'.$Dias1.'"
  14.                       AND T.remolque_otros = "'.$_GET['s'].'"
  15.                     GROUP BY T.servicio_id, C.cliente_id, T.fecha_servicio
  16.                     HAVING COUNT(*) > 1) T1
  17.     GROUP BY servicio_id, C.cliente_id);');
Desgraciadamente y como me viene saliendo desde hace tiempo me sale lo siguiente:

Error en: Resource id #12:

Creo que tendré que investigar al respecto de eso que me está volviendo loco :(
  #21 (permalink)  
Antiguo 26/05/2015, 10:33
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: Tomar el id mínimo de un campo

Cita:
Error en: Resource id #12:
Eso, ya te lo he mencionado, es un mensaje de PHP, no de MySQL.
PHP no entiende SQL, y los DBMS no entienden ni interpretan PHP. Son entornos diferentes, y desde MySQL no obtendrás una respuesta de qué es lo que pasa.

Además, por este tema ya tienes abierto un post en PHP...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #22 (permalink)  
Antiguo 26/05/2015, 10:35
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Respuesta: Tomar el id mínimo de un campo

Lo se jaja, pero me sigue saliendo


Supongo que ya lo demás depende de mí.

Gracias a todos y disculpas por mi mala manera de expresarme :P
  #23 (permalink)  
Antiguo 26/05/2015, 10:39
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: Tomar el id mínimo de un campo

OK. Pero ¿Entendiste que ese problema es OFF TOPIC en este foro?
Si lees las reglas de los foros de BBDD v erás que no se tratan ni se postean temas de programación en lenguajes, y PHP es programación.

En todo caso, despejemos la duda, haciendo lo siguiente: Usa tu propia consulta y reemplaza los valores "aaa" y "bbb" por valores concretos y prueba la consulta en el phpMyadmin. Si devuelve algo, el tema es de PHP, si no devuelve nada, aunque los valores existan, entonces es un problema de datos.
Código MySQL:
Ver original
  1. SELECT T.*  
  2. FROM traslado T
  3.      INNER JOIN servicio S ON T.servicio_id = S.servicio_id
  4.      INNER JOIN cliente C ON S.cliente_id = C.cliente_id
  5.      C.alias = 'aaa'
  6.     AND T.remolque_otros = 'bbb'
  7.     AND (T.servicio_id, C.cliente_id, T.fecha_servicio) IN
  8.         (SELECT   servicio_id, C.cliente_id, MIN(fecha_servicio) fecha_servicio
  9.             FROM (SELECT  T.servicio_id,C. cliente_id, T.fecha_servicio
  10.                      FROM traslado T
  11.                           INNER JOIN servicio S ON T.servicio_id = S.servicio_id
  12.                           INNER JOIN cliente C ON S.cliente_id = C.cliente_id
  13.                     WHERE C.alias = 'aaa'
  14.                       AND T.remolque_otros ='bbb'
  15.                     GROUP BY T.servicio_id, C.cliente_id, T.fecha_servicio
  16.                     HAVING COUNT(*) > 1) T1
  17.     GROUP BY servicio_id, C.cliente_id);
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #24 (permalink)  
Antiguo 26/05/2015, 10:41
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Tomar el id mínimo de un campo

Hola planmental:

Tienes algunos detalles en la consulta, por ejemplo, el manejo del (;) punto y coma: si observas casi al final de la consulta tienes dos (;) por lo tanto, lo que sigue después del primero no te lo toma en cuenta:

Código:
 GROUP BY servicio_id, C.cliente_id););
Ahora bien, no había visto tu post, y cuando traté de contestarlos observé que ya lo habían eliminado, (ya gnzsoloyo te había comentado la razón del por qué?

Sin embargo, encontré una solución que creo que te puede servir... también como comenta gnzsoloyo, lo hice en partes, o en capas..

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+---------+------------+
  3. | id   | cliente | fecha      |
  4. +------+---------+------------+
  5. |    7 | v1      | 2015-05-20 |
  6. |    6 | v1      | 2015-05-20 |
  7. |    5 | v1      | 2015-05-01 |
  8. |    4 | v1      | 2015-03-05 |
  9. |    3 | v2      | 2015-02-02 |
  10. |    2 | v3      | 2015-01-30 |
  11. |    1 | v1      | 2015-01-01 |
  12. +------+---------+------------+
  13. 7 rows in set (0.00 sec)
Primero obtuve la fecha del último cliente registrado:

Código MySQL:
Ver original
  1. mysql> SELECT MAX(fecha) ultimo
  2.     -> FROM tabla;
  3. +------------+
  4. | ultimo     |
  5. +------------+
  6. | 2015-05-20 |
  7. +------------+
  8. 1 row in set (0.00 sec)

Después de eso, obtuve la lista del los clientes que se registraron en esa fecha.

Código MySQL:
Ver original
  1. mysql> SELECT DISTINCT cliente
  2.     -> FROM tabla T1
  3.     -> INNER JOIN ( SELECT MAX(fecha) ultimo
  4.     ->              FROM tabla) T2 ON T1.fecha = T2.ultimo;
  5. +---------+
  6. | cliente |
  7. +---------+
  8. | v1      |
  9. +---------+
  10. 1 row in set (0.02 sec)

Ojo, aquí tendrías que decirnos ¿qué pasaría cuando distintos usuarios se registraron el igual el último día? por con los datos de ejemplo el cliente v1 se registro 2 veces con la fecha 2015-05-20, lo que podría suponer que es posible que otro usuario distinto a v1, se pudo registrar también con esa fecha.

Finalmente, utilicé esta consulta para encontrar la minima fecha de ese cliente, sin embargo como también mencionaban, la mínima fecha para v1 es en realidad (2015-05-20), pero existen otros clientes con una fecha posterior, por lo tanto AGREGUÉ UNA CONDICIÓN NOT EXISTS... así:

Código MySQL:
Ver original
  1. mysql> SELECT T.cliente, MIN(T.fecha) minima
  2.     -> FROM tabla T
  3.     -> INNER JOIN
  4.     -> ( SELECT DISTINCT cliente
  5.     ->   FROM tabla T1
  6.     ->   INNER JOIN ( SELECT MAX(fecha) ultimo
  7.     ->                FROM tabla) T2 ON T1.fecha = T2.ultimo ) T3
  8.     ->   ON T.cliente = T3.cliente
  9.     ->  AND NOT EXISTS ( SELECT id
  10.     ->                   FROM tabla T4
  11.     ->                   WHERE T4.cliente != T.cliente AND T4.fecha > T.fecha);
  12. +---------+------------+
  13. | cliente | minima     |
  14. +---------+------------+
  15. | v1      | 2015-03-05 |
  16. +---------+------------+
  17. 1 row in set (0.00 sec)

Que creo que es el dato que estabas buscando.

Haz la prueba y nos comentas.

Saludos
Leo.
  #25 (permalink)  
Antiguo 26/05/2015, 10:51
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Respuesta: Tomar el id mínimo de un campo

Hola leonardo_josue.

Gracias por tu atención en breve pruebo tu consejo y con respecto a las fechas, no puede haber dos clientes con la misma fecha el campo es datetime.

y con respecto al error de resource que me sale con el script de gnzsoloyo al quitar el script para que me muestre los warnings me sale la fecha:

01 de enero del 1970
  #26 (permalink)  
Antiguo 26/05/2015, 11:44
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Respuesta: Tomar el id mínimo de un campo

Hola, Leo.

Verás hice un script basándome en el tuyo y me salió lo siguiente:

Código MySQL:
Ver original
  1. SELECT C.alias, MIN(T.fecha_servicio) minima
  2.      FROM traslado T
  3.      
  4.      INNER JOIN servicio
  5. ON T.servicio_id = servicio.servicio_id
  6.  
  7. INNER JOIN cliente C
  8. ON servicio.cliente_id = C.cliente_id
  9.  
  10.      INNER JOIN
  11.      ( SELECT DISTINCT S.servicio_id, T1.traslado_id, T1.fecha_servicio, C5.alias
  12.        FROM traslado T1
  13.        
  14.        INNER JOIN servicio S
  15. ON  T1.servicio_id = S.servicio_id
  16.  
  17. INNER JOIN cliente C5
  18. ON S.cliente_id = C5.cliente_id
  19.        
  20.        INNER JOIN ( SELECT MAX(traslado.fecha_servicio) ultimo, C2.alias
  21.                     FROM traslado
  22.                     INNER JOIN servicio
  23. ON traslado.servicio_id = servicio.servicio_id
  24.  
  25. INNER JOIN cliente C2
  26. ON servicio.cliente_id = C2.cliente_id
  27.                    
  28.                     ) T2 ON T1.fecha_servicio = T2.ultimo ) T3
  29.        ON C.alias = T3.alias
  30.       AND NOT EXISTS ( SELECT traslado_id, C4.alias, T4.fecha_servicio
  31.                        FROM traslado T4
  32.                        
  33.                        INNER JOIN servicio
  34. ON T4.servicio_id = servicio.servicio_id
  35.  
  36. INNER JOIN cliente C4
  37. ON servicio.cliente_id = C4.cliente_id
  38.                        
  39.                        
  40.                        WHERE C4.alias != C.alias AND T4.fecha_servicio > T.fecha_servicio)
  41.                        
  42.                        WHERE T.remolque_otros = "'.$_GET['s'].'"
  43. AND C.alias = "'.$Dias1.'"

Me sale error en la fecha_servicio donde lo estoy mandando imprimir

Última edición por planmental; 26/05/2015 a las 11:50
  #27 (permalink)  
Antiguo 26/05/2015, 11:52
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Respuesta: Tomar el id mínimo de un campo

Ya vi mi error, es que estaba declarado como "minima"

Pero me sale la fecha: 01 de enero del 1970

Supongo que no estoy estructurando bien
  #28 (permalink)  
Antiguo 26/05/2015, 12:01
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Respuesta: Tomar el id mínimo de un campo

Disculpa gnzsoloyo.

No había visto tu comentario.

En breve lo pruebo.
  #29 (permalink)  
Antiguo 26/05/2015, 12:31
Avatar de planmental  
Fecha de Ingreso: abril-2015
Mensajes: 100
Antigüedad: 9 años
Puntos: 0
Respuesta: Tomar el id mínimo de un campo

Hola gnzsoloyo.

Para contarte que ya hice lo que me dijiste y salio esto:

Código MySQL:
Ver original
  1. SELECT T.*  
  2. FROM traslado T
  3.      INNER JOIN servicio S ON T.servicio_id = S.servicio_id
  4.      INNER JOIN cliente C ON S.cliente_id = C.cliente_id
  5.      C.alias = "'.$Dias1.'"
  6.     AND T.remolque_otros = "'.$_GET['s'].'"
  7.     AND (T.servicio_id, C.cliente_id, T.fecha_servicio) IN
  8.         (SELECT   servicio_id, C.cliente_id, MIN(fecha_servicio) fecha_servicio
  9.             FROM (SELECT  T.servicio_id,C. cliente_id, T.fecha_servicio
  10.                      FROM traslado T
  11.                           INNER JOIN servicio S ON T.servicio_id = S.servicio_id
  12.                           INNER JOIN cliente C ON S.cliente_id = C.cliente_id
  13.                     WHERE C.alias = "'.$Dias1.'"
  14.                       AND T.remolque_otros ="'.$_GET['s'].'"
  15.                     GROUP BY T.servicio_id, C.cliente_id, T.fecha_servicio
  16.                     HAVING COUNT(*) > 1) T1
  17.     GROUP BY servicio_id, C.cliente_id);

Pero me sigue saliendo la fecha: 01 de enero del 1970

Que significa
  #30 (permalink)  
Antiguo 26/05/2015, 12:56
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: Tomar el id mínimo de un campo

En realidad no estoy viendo nada...

Lo que te dije es:
1) Copia la consulta a una ventana de ejecución de SQL en phpMyadmin.
2) Reemplaza con valores reales lo que usualmente entraría por POST en :
a) "'.$Dias1.'"
b) "'.$_GET['s'].'"
3) Ejecuta la sentencia.
4) Postea el resultado obtenido.

No me interesa lo que recuperes en PHP, quiero ver lo que devuelve MySQL puro. Es decir, todo el registro o registros que devuelva.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: maximo, php
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 19:07.