Comunidad de diseño web y desarrollo en internet online

Intersec en MYSQL ???

Citar            
MensajeEscrito el 23 Jun 2008 01:35 pm
bueno, la situacion es la siguiente:

Tengo dos tablas

user (id,name)
pass(id,pass)

Sucede que hay id en pass que ya no estan en user y es necesario eliminarlos, para esto se me ocurrio hacer una interseccion entre las tablas y lo que sobre, le doy killer (lo borro), pero MYSQL no hace intersec!!!!! :shock: alguna idea que me puedan dar ? :?

PD: he buscado, he buscado, he buscado, pero no he encontrado.

Por jpcw

Claber

1715 de clabLevel

1 tutorial

Genero:Masculino  

AlgoritmicBrainDesigner

firefox
Citar            
MensajeEscrito el 23 Jun 2008 01:53 pm
Eso lo podrias hacer con el "LEFT OUTER JOIN", aca te dejo un tutorial muy bueno:

http://boozox.net/category/web/page/2/

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie7
Citar            
MensajeEscrito el 24 Jun 2008 01:52 am
JOOOOOODER York3rs, super dato.

Gracias

Por jpcw

Claber

1715 de clabLevel

1 tutorial

Genero:Masculino  

AlgoritmicBrainDesigner

firefox
Citar            
MensajeEscrito el 24 Jun 2008 05:26 am
por alguna curiosa razon el outer me dio lio pero logre re crear la expresion SQL para obtener los que no estan en una de las tablas:

Código :

SELECT pass.id
FROM pass
LEFT JOIN usuario ON usuario.id = pass.id
WHERE usuario.id IS NULL


Tarannnnnnnnn :wink:

Por jpcw

Claber

1715 de clabLevel

1 tutorial

Genero:Masculino  

AlgoritmicBrainDesigner

firefox
Citar            
MensajeEscrito el 24 Jun 2008 07:48 pm
Nada mas como consejo, deja el where para filtrar la unión.

Código :

SELECT pass.id
FROM pass
LEFT JOIN usuario 
ON (usuario.id = pass.id AND usuario.id IS NULL)

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 26 Jun 2008 01:58 pm
Dano sabes que me salta una duda.-
Cuando en el "ON (usuario.id = pass.id AND usuario.id IS NULL)" haces " usuario.id IS NULL" es para filtar los datos de la segunda tabla antes de la Union!!! - Supon yo he intentado hacer lo mismo pero con la primera tabla, en este caso seria algo "pass.id IS NULL" y la respuesta obtenida no es la que queria obtener.-

Bueno Dano, gracias por tu ayuda.-

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie7
Citar            
MensajeEscrito el 26 Jun 2008 03:14 pm

york3rs escribió:

Dano sabes que me salta una duda.-
Cuando en el "ON (usuario.id = pass.id AND usuario.id IS NULL)" haces " usuario.id IS NULL" es para filtar los datos de la segunda tabla antes de la Union!!! - Supon yo he intentado hacer lo mismo pero con la primera tabla, en este caso seria algo "pass.id IS NULL" y la respuesta obtenida no es la que queria obtener.-

Bueno Dano, gracias por tu ayuda.-


Mira el Left Join, quiere decir que te traigas todo lo de la tabla "izquierda" de la unión, en este caso la izquierda es pass. Si tu pones pass.id IS NULL, te regresará 0 rows, porque no hay ningun row en la tabla de la izquierda que tenga id NULL. Para resolver tu caso necesitarías usar el Right Join. Si en ese mismo SQL usas el Right Join y pass.id IS NULL, entonces si te regresaría los rows que esperas.


Saludos

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 26 Jun 2008 03:47 pm
Ahh ok, gracias por la pronta respuesta.-
Por que te preguntaba eso:

Por que yo tengo una DB en la que por ejemplo en cada tabla una hay un Idpais que corresponte a la nacionalidad.- Y tengo que unir tablas tbl1 tb2 tb3 que el Idpais sea el mismo. En este caso que es aconsejable. Con un Where Idpais=$_GET['pais'] o que en cada On se ponga tbX.Idpais=$_GET['pais'].-

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie7
Citar            
MensajeEscrito el 26 Jun 2008 04:03 pm
La forma correcta es:

Código :

SELECT
*
FROM
tbl1
INNER JOIN
tbl2
ON tbl1.IdPais = tbl2.IdPais
INNER JOIN
tbl3
ON tbl1.IdPais = tbl3.IdPais
WHERE
tbl1.IdPais = $TuPais;


Realiza un INNER JOIN, ya que requieres una unión basada en el país. También recuerda que no debes poner nunca un valor de $_GET directamente en SQL. Antes debes de validar que sean valores esperados.

Saludos

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 26 Jun 2008 04:17 pm

Dano escribió:

Nada mas como consejo, deja el where para filtrar la unión.

ok pero solo por curiosidad, podrias colocar un ejemplo de como se debe filtrar con el where

Por jpcw

Claber

1715 de clabLevel

1 tutorial

Genero:Masculino  

AlgoritmicBrainDesigner

firefox
Citar            
MensajeEscrito el 26 Jun 2008 04:38 pm

jpcw escribió:

Dano escribió:

Nada mas como consejo, deja el where para filtrar la unión.

ok pero solo por curiosidad, podrias colocar un ejemplo de como se debe filtrar con el where



Despues de que unes las tablas como te interesa, puedes filtrar entonces por Rows especificos o que te interesen.

Código :

SELECT pass.id
FROM pass
LEFT JOIN usuario 
ON usuario.id = pass.id AND usuario.id IS NULL
WHERE 
Usuario = 'Juanito'

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 26 Jun 2008 04:55 pm
Gracias Dano, ahi quede mas claro. Tu que manera para validar los datos aconsejas, por lo que tengo entendido que las expreciones regulares utilizan mucho tiempo de ejecucion.-

Por el momento yo utilizo

Código :

addslashes(trim($cadena));

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie7
Citar            
MensajeEscrito el 26 Jun 2008 06:17 pm

york3rs escribió:

Gracias Dano, ahi quede mas claro. Tu que manera para validar los datos aconsejas, por lo que tengo entendido que las expreciones regulares utilizan mucho tiempo de ejecucion.-

Por el momento yo utilizo

Código :

addslashes(trim($cadena));

york3rs revisa:
http://www.php.net/mysql_escape_string
Y
http://www.php.net/manual/es/function.mysql-real-escape-string.php

Saludos

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 27 Jun 2008 05:30 pm
Gracias Dano, no sabia que también se podía hacer de esas maneras.-

Sabes que me salió la siguiente duda. Si tengo 3 tablas.-

tbl pais
idpais nombre

tbl usuarios
idusuario idpais nombre_usuario idccto etc...

tbl trabajos
idusuario idtrabajo fechainicio fecha termino

tbl tipotrabajos
idtrabajo nombretrabajo descripcion fechainscripcion

tbl centrodecosto
idccto nombre descripcion

Y quiero ver quiero ver los trabajos, "centro de costo" de los usuarios de un país determinado hago, sabiendo ya el Id del país.-

Código :

select * 
from usuarios us
inner join centrodecosto cc ON  us.idccto =cc.idccto
 left join trabajos tb   ON us.idusuario  = tb.idusuario
inner join  tipotrabajos tt.idtrabajo  ON tt. = tb.idtrabajo 
where us.idpais = $idpais


O se puede filtrar antes.- Para usar menos recursos.- Como ej.

Código :


inner join centrodecosto cc ON  (us.idccto =cc.idccto AND  us.idpais = $idpais)

Tengo esa duda, no se si es correcto eso ultimó que hice.-

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie7
Citar            
MensajeEscrito el 27 Jun 2008 05:31 pm
xuta, me equivoque, erean 5 tablas

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie7
Citar            
MensajeEscrito el 27 Jun 2008 06:24 pm

york3rs escribió:

Gracias Dano, no sabia que también se podía hacer de esas maneras.-

Sabes que me salió la siguiente duda. Si tengo 3 tablas.-

tbl pais
idpais nombre

tbl usuarios
idusuario idpais nombre_usuario idccto etc...

tbl trabajos
idusuario idtrabajo fechainicio fecha termino

tbl tipotrabajos
idtrabajo nombretrabajo descripcion fechainscripcion

tbl centrodecosto
idccto nombre descripcion

Y quiero ver quiero ver los trabajos, "centro de costo" de los usuarios de un país determinado hago, sabiendo ya el Id del país.-

Código :

select * 
from usuarios us
inner join centrodecosto cc ON  us.idccto =cc.idccto
 left join trabajos tb   ON us.idusuario  = tb.idusuario
inner join  tipotrabajos tt.idtrabajo  ON tt. = tb.idtrabajo 
where us.idpais = $idpais


O se puede filtrar antes.- Para usar menos recursos.- Como ej.

Código :


inner join centrodecosto cc ON  (us.idccto =cc.idccto AND  us.idpais = $idpais)

Tengo esa duda, no se si es correcto eso ultimó que hice.-

Toma el mismo tiempo, si aplicas el comparativo de idpais, en el on o en el where. La única forma de optimizar consultas, es haciendo consultadas anidadas. Pero solo son necesarias con gran cantidad de datos, si tienes menos de 10,000 registros no creo que tengas problema.

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 28 Jun 2008 01:35 am
Estas tablas son un ejemplo de las tablas que tengo, ya que se me haria mas complejo de explicar.- Lo que pasa que es que cada dia se me estan llenando de mucha mas informacion.-

Un ejemplo x dia los registros que se han ingresado.-

ingresos_tbl1 = 500
ingresos_tbl2 = ingresos_tbl1*7
ingresos_tbl3 = ingresos_tbl1*2
ingresos_tbl4 = ingresos_tbl1*4


Mas menos es haci como un sistema de factura a la que ingresan diferentes empresas a crear sus facturas y guias:

tbl1 = corresponde a las facturas ( app por dia 500 facturas entre todos los clientes)
tbl2= corresponden a los estados de las facturas (son 10 estados "1 al 10") y debe mantener lo registros de los estados enteriores para verificar que usuario realizo un determinado cambio de estado.-
tb3= corresponde a los descuntos o notadecreditos
tb4= a las guias con que se despacha la mercadaria de una determinada factura

el problema es eso. que se me esta llenando la db y no quiero tener complicaciones.-:S

Por eso queria ver si es que podia filtrar la documentacion de cada usuario antes de enlazarla. (el Idusuario es lo mismo a Idpais en la pregunta anterior.-)
Tengo 20 clientes y cada cliente emita app 25 facturas por dia.-

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie7

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.