(SQL) Diferencias entre tablas de una misma tabla?

Iniciado por Karman, 19 Mayo 2009, 00:47 AM

0 Miembros y 1 Visitante están viendo este tema.

Karman

buenas, tengo una duda que me está volviendo loco, tengo una tabla del siguiente tipo:


eid | sid | data
1     1    "lara lara"
1     1    "qewrqer"
2     1    "asdfasdf"
2     1    "lara lara"
3     1    "qewrqer"
3     0    "zxcvzcv"


falta el identificador del tabla pero es solo un campo auto incremental...

el tema es que: necesito obtener todos los datos que no pertenezcan a un "eid", que pertenezcan a un "sid" y que no se repitan... por ejemplo:


eid | sid | data
1     1    "lara lara"
2     1    "asdfasdf"


cuando el eid sería 3 y el sid sería 1... actualmente lo estoy haciendo de una forma un tanto embrollada:

obtengo todos los "data"'s distintos que pertenezcan al sid 1, todos los "dats"'s distintos del eid 3 sid 1, y hago una diferencia de arreglo, eso me devuelve:

"lara lara","asdfasdf"

por lo que luego tengo que buscar la primera referencia en la tabla a un "lara lara" o un "asdfasdf" y obtengo el resultado... pero es muy embrollado y no me parece eficiente...

Alguna idea de como puedo hacerlo de otra forma?

S2

Anibal784

Y por qué no sirve ésto:
Código (SQL) [Seleccionar]

SELECT *
FROM tabla
WHERE eid <> aux_eid AND sid = aux_sid

El que llega sin que lo llamen, se va sin que lo echen.

Citar
Vos no la votaste por eso la tenes adentro.
Lo fino no es lo tuyo, y a mi me chupa un huevo, soy argentino y no peronista, y eso es lo que realmente te molesta.

Karman

porque eso me tira los que son diferentes... no si hay repetidos, y además, aux_eid pueden ser muchos... me tiraría solo si es diferente una fila de la tabla... no se si entendés...

S2

[u]nsigned

Proba unsando la clausula GROUP BY de sql...

No hay atajo ante la duda, el misterio se hace aquí...
Se hace carne en cada uno, el misterio es existir!

Karman

contexto? los agrupo por... y después? que gano con eso?

S2

Anibal784

No entiendo bien qué es lo que quieres, si pueden ser diferentes eid (más de uno, por ejemplo 2, 3 y 4) sería cuestión de generar la consulta mediante el lenguaje. Como estamos en el foro de PHP supongo que debe ser PHP el lenguaje que utilizas, sería mao meno así:
Código (php) [Seleccionar]

<?php
$qry 
"SELECT * FROM tabla WHERE (eid <> ";
foreach(
$eids as $eid){
    
$qry .= $eid;
    if(
Hay siguiente en eids){
        
$qry .= " AND eid <> ";
    }else{
        
$qry .= ") AND (sid = ";
    }
}
$qry .= $sid;

o algo por el estilo, así si por ejemplo $eids = array(2, 3, 4); y $sid = 1 debería generar una consulta mao meno así:

select *
from tabla
where (eid <> 2 AND eid <> 3 AND eid <> 4) AND sid = 1

luego sería cuestión de llamar a una función que te filtre los duplicados... ¿será eso lo que quieres?
El que llega sin que lo llamen, se va sin que lo echen.

Citar
Vos no la votaste por eso la tenes adentro.
Lo fino no es lo tuyo, y a mi me chupa un huevo, soy argentino y no peronista, y eso es lo que realmente te molesta.

Karman

#6
lo que tengo es una tabla de "archivos":

Citariddesc  idduenio idtipo idarchivo
   1           1          1         2            <-"por ejemplo: archivo.exe"
   2           1          2         3            <-"por ejemplo: archivo.com"
   3           2          1         2            <-"por ejemplo: archivo.exe"
   4           3          2         4            <-"por ejemplo: archivo2.com"
   5           4          2         3            <-"por ejemplo: archivo.com"
   6           2          1         5            <-"por ejemplo: archivo2.exe"
   7           5          1         5            <-"por ejemplo: archivo2.exe"
   N....

entonces por ejemplo quiero listar todos los archivos de determinado tipo (sin repetir) menos los de dueño.

por ejemplo si digo dueño 1 me tendría que tirar algo como:

Citariddesc  idduenio idtipo idarchivo
   4           3          2         4            <-"por ejemplo: archivo2.com"
   6           2          1         5            <-"por ejemplo: archivo2.exe"
   N....

como se ve, no me tiene que repetir el "archivo" y no tiene que estar dentro del grupo de archivos del "dueño"...

sería algo así:

select * from tabla
where (idduenio <> 1 AND idarchivo <> "1".idarchivo[0] AND idarchivo <> "1".idarchivo[N]) AND (No Repetido)?


lo que yo estoy haciendo actualmente es: obtengo todos los archivos no repetidos:

Citararchivo.com
archivo.exe
archivo2.com
archivo2.exe

obtengo los archivos del dueño:

Citararchivo.com
archivo.exe

diferencia de arreglos (todos - dueño)

Citararchivo2.com
archivo2.exe

y obtengo los datos de la primera aparición del archivo... pero me parece muy poco eficiente...

Saludos

Anibal784

El que llega sin que lo llamen, se va sin que lo echen.

Citar
Vos no la votaste por eso la tenes adentro.
Lo fino no es lo tuyo, y a mi me chupa un huevo, soy argentino y no peronista, y eso es lo que realmente te molesta.

^Tifa^

Karman, los amigos aca tienen razon... tu solicitud esta un poco confusa de comprender  :-\  al menos yo estoy en el limbo, corrigeme sino es esto lo que deseas.

Hasta lo poco que he podido entender, tu lo que quieres es, sacar todos los registros de la tabla ejemplo que haz posteado, y que dicho registros no se repitan? Si esto es asi analiza un poco la situacion puesto, que tienes 3 campos donde en eid se pueden repetir, mas en data no, o si matcheas con no repetir los registros de data se repetiran los de eid... He realizado un escenario similar al tuyo.

Código (sql) [Seleccionar]


+------+------+-----------+
| eid  | sid  | data      |
+------+------+-----------+
|    1 |    1 | lara lara |
|    1 |    1 | qewrqer   |
|    2 |    1 | asdfasd   |
|    2 |    1 | lara lara |
|    3 |    1 | qewrqer   |
|    3 |    0 | zxcvzcv   |
+------+------+-----------+
6 rows in set (0.00 sec)



Ok mira lo que ocurre si agrupo (Para evitar repetidos) por el campo eid.

Código (sql) [Seleccionar]


+------+------+-----------+
| eid  | sid  | data      |
+------+------+-----------+
|    1 |    1 | lara lara |
|    2 |    1 | asdfasd   |
|    3 |    1 | qewrqer   |



Si agrupamos por data mira que pasaria :

Código (sql) [Seleccionar]


+------+------+-----------+
| eid  | sid  | data      |
+------+------+-----------+
|    1 |    1 | lara lara |
|    1 |    1 | qewrqer   |
|    2 |    1 | asdfasd   |
|    3 |    0 | zxcvzcv   |
+------+------+-----------+
4 rows in set (0.00 sec)




Vas captando la idea con GROUP?  de igual manera si hablamos de DISTINCT, uno de los campos sera los que no se repetiran si utilizas estas clausulas, aunque todavia no entiendo 100% lo que intentas realizar....

Disculpa mi nivel que no logre entender del todo.

Karman

conozco la sentencias DISTINCT (es la que uso para obtener los distintos) como puse acá:

Cita de: Karman en 19 Mayo 2009, 19:52 PMobtengo todos los archivos no repetidos:

Citararchivo.com
archivo.exe
archivo2.com
archivo2.exe

obtengo los archivos del dueño:

Citararchivo.com
archivo.exe

y GROUP ... pero yo no solo necesito que sean distintos, sinó esto:

Citarcomo se ve, no me tiene que repetir los nombres de "archivo" y no tiene que estar dentro del grupo de archivos del "dueño" (un determinado eid).../quote]

Citar
iddesc  idduenio idtipo idarchivo
   1           1          1         2            <-"por ejemplo: archivo.exe"
   2           1          2         3            <-"por ejemplo: archivo.com"
   3           2          1         2            <-"por ejemplo: archivo.exe"
   4           3          2         4            <-"por ejemplo: archivo2.com"
   5           4          2         3            <-"por ejemplo: archivo.com"
   6           2          1         5            <-"por ejemplo: archivo2.exe"
   7           5          1         5            <-"por ejemplo: archivo2.exe"
   N....

S2