PHP - Sumar 1 al cambiar de Valor.

 
Vista:
sin imagen de perfil

Sumar 1 al cambiar de Valor.

Publicado por Iván (4 intervenciones) el 23/07/2017 23:40:21
Qué tal, buenas tardes.
Trato de sacar una consulta con base en lo siguiente:

Suponiendo que tengo dos valores. SI y NO de esta forma en una tabla MySQL.

1-NO
2-NO
3-SI
4-NO
5-NO
6-NO
7-SI
8-SI
9-NO
10-SI
11-SI

¿Cóno le puedo hacer para que de las veces que tengo NO de manera seguida me genere un valor y vaya incrementando? Es decir: en las dos primeras opciones sale NO y quisiera ése me lo regresara como 1; después del 4 al 6 marcar el número 2; en el 9 sería el número 3.
Cada vez que el NO se vea interrumpido por un SI, sumarle 1 a la siguiente vez que salga ya sea una vez o una constante, hasta que salga de nuevo el Si, sumarle nuevamente 1. Poder ejecutarlo con PHP o directo en MySQL.

Espero explicarme.

De antemano, muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve
Val: 3.943
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Sumar 1 al cambiar de Valor.

Publicado por xve (6935 intervenciones) el 24/07/2017 07:48:22
Hola Iván, desde MySQL creo que no podrás hacerlo... creo que la manera mas sencilla es hacerlo con PHP...

Pero no entiendo cuando dices que en el 9 seria el número 3, ya que en el numero 9, esta el NO solo, y tu dices "las veces que tengo NO de manera seguida". Según entiendo, ahí no debería de aumentar al número 3, no?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 12
Ha aumentado su posición en 15 puestos en PHP (en relación al último mes)
Gráfica de PHP

Sumar 1 al cambiar de Valor.

Publicado por Rafael (40 intervenciones) el 24/07/2017 08:26:24
Hola:

Si que puedes hacerlo solo es cuestión de que analises lo que pides...
Lo que necesitas son dos variables... una para el nuevo numero otra para saber que valor tenia el registro anteriror...

Previo a contarte la solución te dire... este foro es para ayudarnos, antes de poder ayudarte debes ayudarnos a ayudarte...
si tu pregunta incluyera mas información como el nombre de la tabla, los campos, etc, etc, etc, es mas fácil y rápido para nosotros ver la solución, logrando que la ayuda sea mas rapida y completamente puntual...

Ahora veamos ... voy a suponer que tienes esto:
1
2
3
4
5
6
7
8
9
10
11
12
create table test (id int, tipo varchar(2));
insert into test values (1, 'NO');
insert into test values (2, 'NO');
insert into test values (3, 'SI');
insert into test values (4, 'NO');
insert into test values (5, 'NO');
insert into test values (6, 'NO');
insert into test values (7, 'SI');
insert into test values (8, 'SI');
insert into test values (9, 'NO');
insert into test values (10, 'SI');
insert into test values (11, 'SI');

Luego con esto vamos por partes...
Necesitas crear las dos variables, una el numero que quieres incrementando pero en cierto sentido la mas importante el valor PREVIO que tiene la columna SI o NO... para en base a ella ir incrementando...

Con ello la condición es que si el valor actual de esta columna (que llame TIPO) es diferente al registro previo entonces suma 1 si no manten el numero actual...

Pues listo con ello te queda un querie tal que asi...
1
2
3
4
5
6
7
8
9
select id
     , tipo
     , @old_tipo
     , case when tipo = @old_tipo then @pos
            else @pos := @pos + 1 end as incremento
     , @old_tipo := tipo
from   test a
     , (select @old_tipo := ''
             , @pos := 0 ) as r

Como veras en el from CREAS ambas variables, y les das un valor inicial... que es para el caso de tipo VACIO (NULO), ya que el primer registro no tiene antecesor, y para el incremental CERO...

Asi pues el primer registro es diferente de NULO por que es NO por lo que suma 1 a CERO poniendolo en 1...
Para el segundo registro TIPO es NO y el valor previo que asignamos al final tambien es NO por lo que NO suma...
Para el tercer registro TIPO es SI y el valor previo es NO por lo que ahora si sumamos 1
Y asi hasta el final
...

Resultado :
temp_lwp

Tambien puedes validar el ejemplo aqui:
http://sqlfiddle.com/#!9/d76dc8/11
Si en proximas consultas dejas un ejemplo en SQL Fiddle es mas rapido y facil ayudarte...

Animo y saludos
Pd. Si la información te sirve a mi me sirve un +1
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Sumar 1 al cambiar de Valor.

Publicado por Iván. (4 intervenciones) el 24/07/2017 16:29:05
Qué tal, Rafael.
Gracias por tu aportación.
Disculpa si me faltó información; es la primera vez que genero una pregunta y a veces olvido detalles a considerar para un mejor apoyo.

Tu respuesta es muy buena, creo que no me expliqué tan mal. Lo único que no consideré al escribir, es que no quiero que me incremente 1 cuando aparezca Si, sólo cuando tenga el NO.
En el mismo ejemplo que tengo en base de datos:
Tabla: Asistencia
id - asistencia
1 - NO
2 - NO
3 - SI
4 - NO
5 - NO
6 - NO
7 - SI
8 - SI
9 - NO
10 - SI
11-SI
Me interesa sumar lo grupos, ya sea de uno o varios NO seguidos y que se incremente 1 hasta la siguiente vez que aparezca NO.
En este ejemplo, me tendría que devolver 3 grupos nada más. el No. 1 sería del id 1y2, el segundo del id 4 al 6, y el tercero del id 9.
CAda vez que el NO se vea interrumpido por un Si, se generará otro grupo, hasta la siguiente vez que aparezca NO.

Espero así explicarlo un poco más.
Analizo tu ejemplo, que es bastante interesante y veo si lo puedo ajustar a mis necesidades, de cualquiero forma quedaré pendiente de tu amable respuesta.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 12
Ha aumentado su posición en 15 puestos en PHP (en relación al último mes)
Gráfica de PHP

Sumar 1 al cambiar de Valor.

Publicado por Rafael (40 intervenciones) el 24/07/2017 18:20:02
Hola, Ivan:

Vaya yo no soy ningun mentor o corrector vocacional pero me atrevo hacerte un par de comentarios...

1. La pd dice que si te sirve le des un +1 a la respuesta... algo simple y sencillo de gesto de agradecimiento solo por tratar de ayudarte y proponerte soluciones. Tristemente no leiste hasta el final o desestimas el intento de ayudar. No le das +1.

2. Es aun mas triste que viendo la respuesta no puedas deducir el como modificar el query para que haga lo que no supiste expresar...

A ver te he dicho:
Con ello la condición es que si el valor actual de esta columna (que llame TIPO) es diferente al registro previo entonces suma 1 si no manten el numero actual...

Me pregunto sabes cual es esa condicion y donde esta?????

Ahora bien si esa no era condición que querias expresar si no una diferente:
Me interesa sumar lo grupos, ya sea de uno o varios NO seguidos y que se incremente 1 hasta la siguiente vez que aparezca NO.

No encuentras como modificar la condición???
En este punto yo me replantearia si tengo al menos los conocimientos basicos para enfrentar esta tarea....

Bueno como siempre aqui tienes la consulta nueva en base a los nuevos requisitos...
1
2
3
4
5
6
7
8
9
select id
     , tipo
     , @old_tipo
     , case when tipo != @old_tipo and tipo = 'NO' then @pos := @pos + 1
            else @pos end as incremento
     , @old_tipo := tipo
from   test a
     , (select @old_tipo := ''
             , @pos := 0 ) as r

Ai en efecto solo cambias
1
2
case when tipo != @old_tipo and tipo = 'NO' then @pos := @pos + 1
            else @pos end as incremento
quesignifica que el tipo actual no coincide con el anteriror y que ademas el actual es NO luego entonces y solo entonces suma 1

el resultado :
1
2
3
4
5
6
7
8
9
10
11
12
d 	tipo 	@old_tipo 	incremento 	@old_tipo := tipo
1 	NO 		1 	NO
2 	NO 	NO 	1 	NO
3 	SI 	NO 	1 	SI
4 	NO 	SI 	2 	NO
5 	NO 	NO 	2 	NO
6 	NO 	NO 	2 	NO
7 	SI 	NO 	2 	SI
8 	SI 	SI 	2 	SI
9 	NO 	SI 	3 	NO
10 	SI 	NO 	3 	SI
11 	SI 	SI 	3 	SI

Bueno como siempre lo puedes ver aqui :
http://sqlfiddle.com/#!9/d76dc8/12 Y jugar con el para hacer mas pruebas...

Saludos.
Pd. Ya no pedirte el +1 verdad???
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Sumar 1 al cambiar de Valor.

Publicado por Iván (4 intervenciones) el 24/07/2017 18:59:24
Rafael, buenas tardes.

Nuevamente te agradezco tus comentarios.

Disculpa si no había calificado tu comentario; es la primera vez que entro a este foro y la primer consulta que hago. Así que, como podrás observar, me fallan algunso detalles aún aquí.

Ya califiqué, según yo.

Por otro lado, analizaba el código cuando recibí tu nueva respuesta.

Nuevamente te agradezco la información brindada, pues sí me has ayudado mucho.

Si hay algo que haga falta por calificar, por favor házmelo saber y con gusto lo genero.

¡Gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Sumar 1 al cambiar de Valor.

Publicado por Iván. (4 intervenciones) el 24/07/2017 16:21:23
Qué tal., XVE.
Gracias por responder.
Tienes razón, ahí no especifiqué muy bien mis ideas. Disculpa.
En el mismo ejemplo que tengo en base de datos:
id-asistencia
1-NO
2-NO
3-SI
4-NO
5-NO
6-NO
7-SI
8-SI
9-NO
10-SI
11-SI
Me interesa realizar un conteo de los NO, ya sea que vengan seguidos o uno solo. La idea es que me regrese, en este caso, 3 grupos de NO en este ejemplo. El primer grupo sería del 1 y2, el segundo del 4 al 6 y el tercero sería del 9. Cada vez que en la tabla se vea interrumpido por un SI (Sea uno o varios) debe de generar un incremento, cuando aparezca NO la siguiente vez.
No sé si me explico un poco mejor.
De antemano, muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar