Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: Karman en 19 Mayo 2009, 00:47 am



Título: (SQL) Diferencias entre tablas de una misma tabla?
Publicado por: Karman en 19 Mayo 2009, 00:47 am
buenas, tengo una duda que me está volviendo loco, tengo una tabla del siguiente tipo:

Código:
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:

Código:
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:

Código:
"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


Título: Re: (SQL) Diferencias entre tablas de una misma tabla?
Publicado por: Anibal784 en 19 Mayo 2009, 01:24 am
Y por qué no sirve ésto:
Código
  1. SELECT *
  2. FROM tabla
  3. WHERE eid <> aux_eid AND sid = aux_sid
  4.  


Título: Re: (SQL) Diferencias entre tablas de una misma tabla?
Publicado por: Karman en 19 Mayo 2009, 04:05 am
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


Título: Re: (SQL) Diferencias entre tablas de una misma tabla?
Publicado por: [u]nsigned en 19 Mayo 2009, 05:32 am
Proba unsando la clausula GROUP BY de sql...


Título: Re: (SQL) Diferencias entre tablas de una misma tabla?
Publicado por: Karman en 19 Mayo 2009, 05:43 am
contexto? los agrupo por... y después? que gano con eso?

S2


Título: Re: (SQL) Diferencias entre tablas de una misma tabla?
Publicado por: Anibal784 en 19 Mayo 2009, 15:41 pm
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
  1. <?php
  2. $qry = "SELECT * FROM tabla WHERE (eid <> ";
  3. foreach($eids as $eid){
  4.    $qry .= $eid;
  5.    if(Hay siguiente en eids){
  6.        $qry .= " AND eid <> ";
  7.    }else{
  8.        $qry .= ") AND (sid = ";
  9.    }
  10. }
  11. $qry .= $sid;
  12.  
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í:
Código:
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?


Título: Re: (SQL) Diferencias entre tablas de una misma tabla?
Publicado por: Karman en 19 Mayo 2009, 19:52 pm
lo que tengo es una tabla de "archivos":

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....

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:

Citar
iddesc  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í:

Código:
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:

Citar
archivo.com
archivo.exe
archivo2.com
archivo2.exe

obtengo los archivos del dueño:

Citar
archivo.com
archivo.exe

diferencia de arreglos (todos - dueño)

Citar
archivo2.com
archivo2.exe

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

Saludos


Título: Re: (SQL) Diferencias entre tablas de una misma tabla?
Publicado por: Anibal784 en 19 Mayo 2009, 20:36 pm
Si es sólo el nombre de archivo Distinct  (http://www.sql-tutorial.com/sql-distinct-sql-tutorial/)


Título: Re: (SQL) Diferencias entre tablas de una misma tabla?
Publicado por: ^Tifa^ en 19 Mayo 2009, 21:06 pm
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
  1.  
  2. +------+------+-----------+
  3. | eid  | sid  | DATA      |
  4. +------+------+-----------+
  5. |    1 |    1 | lara lara |
  6. |    1 |    1 | qewrqer   |
  7. |    2 |    1 | asdfasd   |
  8. |    2 |    1 | lara lara |
  9. |    3 |    1 | qewrqer   |
  10. |    3 |    0 | zxcvzcv   |
  11. +------+------+-----------+
  12. 6 ROWS IN SET (0.00 sec)
  13.  
  14.  

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

Código
  1.  
  2. +------+------+-----------+
  3. | eid  | sid  | DATA      |
  4. +------+------+-----------+
  5. |    1 |    1 | lara lara |
  6. |    2 |    1 | asdfasd   |
  7. |    3 |    1 | qewrqer   |
  8.  
  9.  

Si agrupamos por data mira que pasaria :

Código
  1.  
  2. +------+------+-----------+
  3. | eid  | sid  | DATA      |
  4. +------+------+-----------+
  5. |    1 |    1 | lara lara |
  6. |    1 |    1 | qewrqer   |
  7. |    2 |    1 | asdfasd   |
  8. |    3 |    0 | zxcvzcv   |
  9. +------+------+-----------+
  10. 4 ROWS IN SET (0.00 sec)
  11.  
  12.  
  13.  

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.


Título: Re: (SQL) Diferencias entre tablas de una misma tabla?
Publicado por: Karman en 19 Mayo 2009, 22:10 pm
conozco la sentencias DISTINCT (es la que uso para obtener los distintos) como puse acá:

obtengo todos los archivos no repetidos:

Citar
archivo.com
archivo.exe
archivo2.com
archivo2.exe

obtengo los archivos del dueño:

Citar
archivo.com
archivo.exe

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

Citar
como 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


Título: Re: (SQL) Diferencias entre tablas de una misma tabla?
Publicado por: ^Tifa^ en 20 Mayo 2009, 02:16 am
Karman cielo nadie esta diciendo que no sabes para que sirve GROUP o DISTINCT, lo que tratabamos de decirte es que aun tu peticion no nos queda claro.

Analisando tu propuesta primera, dices que quieres todos los registros del campo data que contengan el sid = 1 aunque no especificamente pertenezcan a un eid especifico mas tu no quieres que se repita ni la data ni el eid?

Porque mira una formita de hacerlo, acorde a tu ejemplo inicial.

Código
  1.  
  2. mysql> SELECT DISTINCT(DATA), eid, sid FROM ejemplo GROUP BY(eid);
  3. +-----------+------+------+
  4. | DATA      | eid  | sid  |
  5. +-----------+------+------+
  6. | lara lara |    1 |    1 |
  7. | asdfasdf  |    2 |    1 |
  8. | qewrqer   |    3 |    1 |
  9. +-----------+------+------+
  10. 3 ROWS IN SET (0,00 sec)
  11.  
  12.  

Esta es la tabla creada por mi para recrear tu escenario :

Código
  1.  
  2. mysql> SELECT * FROM ejemplo;
  3. +------+------+-----------+
  4. | eid  | sid  | DATA      |
  5. +------+------+-----------+
  6. |    1 |    1 | lara lara |
  7. |    1 |    1 | qewrqer   |
  8. |    2 |    1 | asdfasdf  |
  9. |    2 |    1 | lara lara |
  10. |    3 |    1 | qewrqer   |
  11. |    3 |    0 | zxcvzcv   |
  12. +------+------+-----------+
  13. 6 ROWS IN SET (0,38 sec)
  14.  
  15.  

Dime si estamos mas cerca de tu peticion?


Título: Re: (SQL) Diferencias entre tablas de una misma tabla?
Publicado por: Karman en 20 Mayo 2009, 02:49 am
bueno, trato de explicarlo con mi ejemplo inicial para ver si logro hacerme entender... tenemos esto:

Código
  1. mysql> SELECT * FROM ejemplo;
  2. +------+------+-----------+
  3. | eid  | sid  | DATA      |
  4. +------+------+-----------+
  5. |    1 |    1 | lara lara |
  6. |    1 |    1 | qewrqer   |
  7. |    2 |    1 | asdfasdf  |
  8. |    2 |    1 | lara lara |
  9. |    3 |    1 | qewrqer   |
  10. |    3 |    0 | zxcvzcv   |
  11. +------+------+-----------+
  12. 6 ROWS IN SET (0,38 sec)
  13.  

yo necesitaría los DATA (olvidemos que sean distintos por un momento), que NO pertenezcan a un determinado eid... (olvidemos el sid tb)... repito lo que puse la otra vez reducido (omito lo de la repetición):

Citar
no tiene que estar dentro del grupo de archivos del "dueño" (un determinado eid)

tendríamos (por ejemplo pasándole como argumento eid=1):

Código
  1. mysql> SELECT * FROM ejemplo;
  2. +------+-----------+
  3. | eid  | DATA      |
  4. +------+-----------+
  5. |    1 | lara lara | *** archivo de eid 1
  6. |    1 | qewrqer   | *** archivo de eid 1
  7. |    2 | asdfasdf  |
  8. |    2 | lara lara | *** archivo de eid 1
  9. |    3 | qewrqer   | *** archivo de eid 1
  10. +------+-----------+
  11. 6 ROWS IN SET (0,38 sec)
  12.  

me tendría que devolver:

Código
  1. mysql> SELECT X lara lara;
  2. +------+-----------+
  3. | eid  | DATA      |
  4. +------+-----------+
  5. |    2 | asdfasdf  |
  6. +------+-----------+
  7. 1 ROWS IN SET (0 sec)
  8.  

y si le pasamos como argumento eid=3) (el primer ejemplo):

Código
  1. mysql> SELECT * FROM ejemplo;
  2. +------+-----------+
  3. | eid  | DATA      |
  4. +------+-----------+
  5. |    1 | lara lara |
  6. |    1 | qewrqer   | *** archivo de eid 3
  7. |    2 | asdfasdf  |
  8. |    2 | lara lara |
  9. |    3 | qewrqer   | *** archivo de eid 3
  10. +------+-----------+
  11. 6 ROWS IN SET (0,38 sec)
  12.  

me tendría que devolver:

Código
  1. mysql> SELECT X lara lara;
  2. +------+-----------+
  3. | eid  | DATA      |
  4. +------+-----------+
  5. |    1 | lara lara | *** se repite
  6. |    2 | asdfasdf  |
  7. |    2 | lara lara | *** se repite
  8. +------+-----------+
  9. 1 ROWS IN SET (0 sec)
  10.  

eso sería lo fundamental... ahora como "lara lara" se repite entre los resultados válidos, necesitaría solo uno...

creo que simplemente no se puede directamente con SQL, pero como creen que sería la forma más eficiente de hacerlo?

S2


Título: Re: (SQL) Diferencias entre tablas de una misma tabla?
Publicado por: Karman en 20 Mayo 2009, 04:19 am
lo conseguí!!!!  :xD esta es la sentencia:

Código
  1. SELECT * FROM ejemplo WHERE (DATA) NOT IN (SELECT DATA FROM ejemplo WHERE eid =X) GROUP BY DATA

S2


Título: Re: (SQL) Diferencias entre tablas de una misma tabla?
Publicado por: Anibal784 en 20 Mayo 2009, 04:27 am
Karman, por lo que logro entender sólo quieres listar los archivos de un usuario que aún no son de él, por lo que lo único que necesitas es, o el id del archivo o el nombre del archivo, en ambos casos un distinc en el primer SELECT debería bastar.
Si aún quieres retener todos los campos, podrías usar GROUP BY para agruparlos por DATA y así se te haga más fácil luego el procesamiento (ya que al estar ordenados sería cuestión de agarrar un registro e ignorar mientras sean iguales).


Título: Re: (SQL) Diferencias entre tablas de una misma tabla?
Publicado por: Karman en 20 Mayo 2009, 04:33 am
Si aún quieres retener todos los campos, podrías usar GROUP BY para agruparlos por DATA y así se te haga más fácil luego el procesamiento (ya que al estar ordenados sería cuestión de agarrar un registro e ignorar mientras sean iguales).

si... es lo que termine haciendo, pero en MSSQL me patea por que hay multiples eid y no sabe como agruparlos... en MySQL me devuelve el primero (lo que quería), ahora el tema es hacer que funcine en ambas bases de datos (uso las dos) o hacerlo a mano...

S2


Título: Re: (SQL) Diferencias entre tablas de una misma tabla?
Publicado por: Karman en 21 Mayo 2009, 03:43 am
pa los que saben...no hay forma de hacer que el código de arriba funcione con ambas bases de datos??? :huh: no le encuentro la vuelta...  :-(

S2


Título: Re: (SQL) Diferencias entre tablas de una misma tabla?
Publicado por: Toxico en 26 Mayo 2009, 05:16 am
Hola, Si Solo Necesitas el campo DATA , solo coloca DATA en lugar de *, con esto te deberia de funcionar en MSSQL.
Código:
SELECT DATA FROM ejemplo WHERE (DATA) NOT IN (SELECT DATA FROM ejemplo WHERE eid =X) GROUP BY DATA

Saludos
Miguel Angel