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

Restar en Mysql

Estas en el tema de Restar en Mysql en el foro de Mysql en Foros del Web. Hola, Gracias por entrar y leer mi problema. Les cuento un poco, tratare de explicarme lo mejor posible. Estoy haciendo un script de estadísticas e ...
  #1 (permalink)  
Antiguo 24/08/2009, 09:51
 
Fecha de Ingreso: junio-2009
Mensajes: 231
Antigüedad: 14 años, 10 meses
Puntos: 1
Restar en Mysql

Hola, Gracias por entrar y leer mi problema.

Les cuento un poco, tratare de explicarme lo mejor posible.

Estoy haciendo un script de estadísticas e intercambio de visitas para mi sitio.

Tengo una tabla llamada ‘contador’ que cuenta las visitas recibidas desde otros sitios
Y tengo otra tabla que se llama ‘out’ que cuenta las visitas que salen de mi sito

La estructura de la tabla contador es la siguiente…

id in_direccion in_contador in_fecha

in_direccion donde guardo las url
in_contador aquí sumo todas las visitas entrantes
in_fecha Aquí la fecha

Y la estructura de la tabla uot es la siguiente

id url visitas fecha

url: Donde guardo la url
visitas: aquí sumo todas las visitas salientes
fecha : Aquí la fecha


Gracias a las columnas fechas puedo ver cuantas visitas salieron o entraron por dia…

Yo con esta consulta organizo en forma de top por dia las visitas entrantes o salientes

Por ejemplo hago una consulta con la tabla contador para ver cuantas visitas entraron a mi sitio desde otras paginas.

select in_direccion, in_contador,fecha FROM contador GROUP BY fecha, in_direccion ORDER BY fecha DESC , in_contador des

Y me devuelve algo asi…

---------- URL -------------------------- VISITAS ---------- FECHA--
http://www.dominio.net------------------1359 -------------2009-08-24
http://www.bbbbbbbbbbbb.com-------- 1193 -------------2009-08-24
http://www.ccccccccc.com-------------- 269 --------------2009-08-24
http://www.dddddddddd.com------------ 78 ---------------2009-08-24
http://eeeeeeee.com------------------------31 ---------------2009-08-24
http://www.ffffff.net ----------------------24 ---------------2009-08-24
|||||||||||||||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||| ||||||||||||||||||||||||||||||||||
http://www.dominio.net------------------1850 -------------2009-08-23
http://www.bbbbbbbbbbbb.com-------- 1600 -------------2009-08-23
http://www.ccccccccc.com-------------- 450 --------------2009-08-23
http://www.dddddddddd.com------------ 80 ---------------2009-08-23
http://eeeeeeee.com------------------------45 ---------------2009-08-23
http://www.ffffff.net ----------------------36 ---------------2009-08-23


Y asi….

A esta consulta la uso tambien para las visitas salientes desde mi sitio y funciona igual.


Ahora viene el problema….

Tengo el sitio www.dominio.net el cual se por una tabla las visitas que me envio a mi sitio y el cual desde otra tabla se las visitas que le mande y desde mi sitio…

Por ejemplo…

www.dominio.net
Veo las Entradas: 1400
Veo las Salidas: 700

Entonces se que me envió 1400 y se que yo le envié 700…

Ahora… lo que yo quiero saber es cuantas visitas le tengo que enviar a dominio.com para quedar iguales…

Si el me envio 1400 y yo 700 seria algo asi

1400-700= 700

Entonces significa que le tengo que enviar 700 visitas asi logramos intercambio 1 a 1

La pregunta del millon…

Como puedo hacer una consulta que me como resultado la resta de visitas recibidas menos visitas enviadas (1400-700 como el ejemplo anterior) de todos los sitios que tengo en las dos tablas…

Y que me los acomode en forma decreciente por dia…

Por ejemplo

Dominio.net____700
bbbbbb.com____600
cccccc.com_____350

Esto es posible?

PD: Disculpen si la hice muy larga…
  #2 (permalink)  
Antiguo 24/08/2009, 09:56
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Restar en Mysql

La verdad, tu entiendes tu problema

Pero si se puede restar dos campos con base en una condición.

select (campo1 - campo2) as resta from tabla;

Aplica para tablas anidadas, y solo para campos numéricos. (Que es lo que necesitas)

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 24/08/2009, 10:31
 
Fecha de Ingreso: junio-2009
Mensajes: 231
Antigüedad: 14 años, 10 meses
Puntos: 1
Respuesta: Restar en Mysql

No se entiende ?

Me explique mal?
  #4 (permalink)  
Antiguo 24/08/2009, 15:18
 
Fecha de Ingreso: mayo-2008
Mensajes: 489
Antigüedad: 15 años, 11 meses
Puntos: 8
Respuesta: Restar en Mysql

lo que necesitas es hacer una simple resta.

$entradas = 1400;
$salidas = 700;
$pendientes = $entradas-$salidas;

los datos de entrada y salida por lo que leo lo sabes sacar, así que no debes tener problema.

Suerte
  #5 (permalink)  
Antiguo 24/08/2009, 17:40
 
Fecha de Ingreso: junio-2009
Mensajes: 231
Antigüedad: 14 años, 10 meses
Puntos: 1
Respuesta: Restar en Mysql

Sip...

no entiendo
  #6 (permalink)  
Antiguo 24/08/2009, 19:35
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Restar en Mysql

Autista... tu entiendes tu problema. Pero trata de explicar lo que requieres con un ejemplo mas simple que todos en este foro puedan entender. Luego lo aplicas a tu problema real.

La verdad, yo no te entendí.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #7 (permalink)  
Antiguo 24/08/2009, 20:47
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: Restar en Mysql

Voy a hacer una hipótesis basado en lo que describes en el primer post (que resulta algo confuso):
1) Las dos tablas contienen una direccion URL de una página a la cual tu web está elacionada de alguna forma. El como es irrelevante a nivel de bases de datos.
2) En una tabla conservas la información de visitas originadas por esa web a tu web; en la otra las visitas originadas a esa web desde tu web.
3) Cada registro corresponde a un sólo día, por lo cual el campo de sumatoria de visitas se refiere a las visitas realizadas en una u otra dirección el mismo día.

Si lo que quieres es establecer el saldo a favor o en contra de las visitas desde y hacia esa web (listando todas las web donde la idea es la misma), la consulta sería algo así:
Código sql:
Ver original
  1. SELECT
  2.     in_direccion URL,
  3.     in_contador ENTRANTES,
  4.     visitas SALIENTES,
  5.     (in_contador-visitas) SALDO,
  6.     in_fecha FECHA
  7. FROM contador C LEFT JOIN `out` O ON c.in_direccion = O.url AND C.fecha
  8. = O.fecha
  9. ORDER BY URL ASC, FECHA ASC, ENTRANTES DESC, SALIENTES DESC, SALDO DESC;

Si, en cambio, quieres saber el total de visitas desde y hacia y su saldo, sin discriminación de fechas, hay que hace algo más complicado:

Código sql:
Ver original
  1. SELECT URL, ENTRANTES, SALIENTES (ENTRANTES-SALIENTES) SALDO
  2. FROM
  3.   SELECT
  4.     in_direccion URL,
  5.     SUM(in_contador) ENTRANTES,
  6.     SUM(visitas) SALIENTES,
  7.     in_fecha FECHA
  8.   FROM contador C LEFT JOIN `out` O ON c.in_direccion = O.url AND C.fecha
  9. = O.fecha
  10. GROUP BY URL) TABLA1
  11. ORDER BY URL ASC, FECHA ASC, ENTRANTES DESC, SALIENTES DESC, SALDO DESC;

Habría que probar...
__________________
¿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 24/08/2009, 23:02
 
Fecha de Ingreso: junio-2009
Mensajes: 231
Antigüedad: 14 años, 10 meses
Puntos: 1
Respuesta: Restar en Mysql

Hola gnzsoloyo.

Acabo de ver tu respuesta. aun no lo probé porque estoy de viajes.
mañana miércoles a final del día lo probare.

Desde ya muchísimas gracias. me encuentro muy ansioso de ver y probar tu consulta

Te dejo Karma
  #9 (permalink)  
Antiguo 25/08/2009, 01:11
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Restar en Mysql

Únicamente añadiría a la propuesta de gnzsoloyo el uso de IFNULL en las restas y a la hora de mostrar los datos para el caso de que una dirección hubiera recibido entradas, pero no visitas (lo he adaptado a la consulta de gnzsoloyo con algún cambio en el order by).
SELECT URL, ENTRANTES, IFNULL(SALIENTES,0), (ENTRANTES-IFNULL(SALIENTES,0)) SALDO
FROM
SELECT
in_direccion URL,
SUM(in_contador) ENTRANTES,
SUM(visitas) SALIENTES,
in_fecha FECHA
FROM contador C LEFT JOIN `out` O ON c.in_direccion = O.url AND C.fecha
= O.fecha
GROUP BY URL) TABLA1
ORDER BY URL ASC, FECHA ASC, SALDO DESC;

Y otra cosa: si existiera la posibilidad de que hubiera visitas, pero no entradas de una misma dirección en un mismo día, estas últimas no saldrían, ni tampoco sus datos. No he probado nada.

Última edición por jurena; 25/08/2009 a las 01:42
  #10 (permalink)  
Antiguo 25/08/2009, 05: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, 4 meses
Puntos: 2658
Respuesta: Restar en Mysql

Cita:
Iniciado por JURENA
Y otra cosa: si existiera la posibilidad de que hubiera visitas, pero no entradas de una misma dirección en un mismo día, estas últimas no saldrían, ni tampoco sus datos. No he probado nada.
Si,es cierto. No consideré la posibiulidad, pero afecta mucho la consulta la el orden de selección de tablas. Si en la primera no hay URLs que si están en la segunda, estos no aparecerán, por lo que en realidad habría que hacer una consulta bastante más compleja para obtener un resultado completamente correcto.
Esa es una buena observación.
Mi sugerencia sería realizarlas con tablas MEMORY y crear todo el proceso en un Stored Procedure que devuelva el resultado final.
__________________
¿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 25/08/2009, 12:01
 
Fecha de Ingreso: junio-2009
Mensajes: 231
Antigüedad: 14 años, 10 meses
Puntos: 1
Respuesta: Restar en Mysql

Hola gnzsoloyo y Jurena.

Muchisimas gracias a los dos por los comentarios y las ayudas.

EL vieje se pincho asique estoy por aqui tratando de sobrevivir a esta consulta...

Es infernal... no crei que fuece tan complicada.


Quiero cambiar las cosas que estan en modo de ejempl0 por las correctas por ejemplo ENTRANTES SALIENES pero al estar tan complicado voy a tener que pedirles que me digan lo que va y lo que no va...

miren esta es mi tabla de mysql la cual se llama "out" Esta guarda las entradas que salen de mi sitio.

CREATE TABLE `out` (
`id` int(11) NOT NULL auto_increment,
`url` varchar(500) NOT NULL,
`visitas` int(11) NOT NULL,
`fecha` date NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=17 ;


Y ahora la tabla que guarda las visitas que me envian las otras paginas... (A esta le cambie de ultima hora los nombres... perdon)

Se llama "contador_url"


TABLE `contador_url` (
`url_id` int(10) NOT NULL auto_increment,
`url_direccion` text NOT NULL,
`url_contador` int(10) default '0',
`fecha` date NOT NULL default '0000-00-00',
PRIMARY KEY (`url_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=11203 ;




Pregunto por ejemplo a que se refieren con ENTRANTES SALIENTES SALDO TABLA1

Estoy un poco perdido...
  #12 (permalink)  
Antiguo 25/08/2009, 12:15
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: Restar en Mysql

La cosa es simple:
ENTRANTES: Visitas entrantes desde otra URL.
SALIENTES: Visitas enviadas desde tu URL a otra.
TABLA1: Es un ALIAS para la tabla que se genera en memoria (tabla derivada) al ejecutar una subconsulta. En MySQL toda tabla derivada debe tener su propio alias.
SALDO: Es simplemente el resultado de la resta entre las visitas entrantes de otra web a y las visitas enviadas a esa web.

La consulta propuesta parte sobre los supuestos que mencioné anoche:
Cita:
Voy a hacer una hipótesis basado en lo que describes en el primer post (que resulta algo confuso):
1) Las dos tablas contienen una direccion URL de una página a la cual tu web está elacionada de alguna forma. El como es irrelevante a nivel de bases de datos.
2) En una tabla conservas la información de visitas originadas por esa web a tu web; en la otra las visitas originadas a esa web desde tu web.
3) Cada registro corresponde a un sólo día, por lo cual el campo de sumatoria de visitas se refiere a las visitas realizadas en una u otra dirección el mismo día.
Si no se cumplen esos supuestos, nos tienes que dar una explicación más detallada del modelo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #13 (permalink)  
Antiguo 26/08/2009, 12:08
 
Fecha de Ingreso: junio-2009
Mensajes: 231
Antigüedad: 14 años, 10 meses
Puntos: 1
Respuesta: Restar en Mysql

Bueno, por aquí estoy.

He estado haciendo pruebas y mas pruebas y algo logre sacar pero esto me sobrepasa mal en conocimientos…

Por lo tanto se me ocurrio una solución mucho mas sencilla.

A las visitas que entran las cuento en una pagina in y a las que salen las cuento en una pagina que se llama out

Entonces creare una nueva tabla y cada ves que un sitio Por ejemplo dominio.com me envíe una visita le sumare 1 a las visitas de dominio.com. Y cada ves que yo le envie una visita a dominio.com le restare una visita a dominio.com

Entonces tendre una tabla pura y exclusivamente para eso. La cual podre acceder a ella desde una simple consulta.

Me parece que será lo mejor para una persona como yo

Bueno desde ya muchas gracias por su ayuda y les agradesco infinitamente su tiempo ya que ayudaron a ver y a solucionar el problema de la mejor forma posible.

Saludos
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 23:48.