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
Y por qué no sirve ésto:
SELECT *
FROM tabla
WHERE eid <> aux_eid AND sid = aux_sid
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
Proba unsando la clausula GROUP BY de sql...
contexto? los agrupo por... y después? que gano con eso?
S2
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í:
<?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?
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
Si es sólo el nombre de archivo Distinct (http://www.sql-tutorial.com/sql-distinct-sql-tutorial/)
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.
+------+------+-----------+
| 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.
+------+------+-----------+
| eid | sid | data |
+------+------+-----------+
| 1 | 1 | lara lara |
| 2 | 1 | asdfasd |
| 3 | 1 | qewrqer |
Si agrupamos por data mira que pasaria :
+------+------+-----------+
| 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.
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
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.
mysql> select distinct(data), eid, sid from ejemplo group by(eid);
+-----------+------+------+
| data | eid | sid |
+-----------+------+------+
| lara lara | 1 | 1 |
| asdfasdf | 2 | 1 |
| qewrqer | 3 | 1 |
+-----------+------+------+
3 rows in set (0,00 sec)
Esta es la tabla creada por mi para recrear tu escenario :
mysql> select * from ejemplo;
+------+------+-----------+
| eid | sid | data |
+------+------+-----------+
| 1 | 1 | lara lara |
| 1 | 1 | qewrqer |
| 2 | 1 | asdfasdf |
| 2 | 1 | lara lara |
| 3 | 1 | qewrqer |
| 3 | 0 | zxcvzcv |
+------+------+-----------+
6 rows in set (0,38 sec)
Dime si estamos mas cerca de tu peticion?
bueno, trato de explicarlo con mi ejemplo inicial para ver si logro hacerme entender... tenemos esto:
mysql> SELECT * FROM ejemplo;
+------+------+-----------+
| eid | sid | DATA |
+------+------+-----------+
| 1 | 1 | lara lara |
| 1 | 1 | qewrqer |
| 2 | 1 | asdfasdf |
| 2 | 1 | lara lara |
| 3 | 1 | qewrqer |
| 3 | 0 | zxcvzcv |
+------+------+-----------+
6 rows IN SET (0,38 sec)
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):
Citarno tiene que estar dentro del grupo de archivos del "dueño" (un determinado eid)
tendríamos (por ejemplo pasándole como argumento
eid=1):
mysql> SELECT * FROM ejemplo;
+------+-----------+
| eid | DATA |
+------+-----------+
| 1 | lara lara | *** archivo de eid 1
| 1 | qewrqer | *** archivo de eid 1
| 2 | asdfasdf |
| 2 | lara lara | *** archivo de eid 1
| 3 | qewrqer | *** archivo de eid 1
+------+-----------+
6 rows IN SET (0,38 sec)
me tendría que devolver:
mysql> SELECT X lara lara;
+------+-----------+
| eid | DATA |
+------+-----------+
| 2 | asdfasdf |
+------+-----------+
1 rows IN SET (0 sec)
y si le pasamos como argumento
eid=3) (el primer ejemplo):
mysql> SELECT * FROM ejemplo;
+------+-----------+
| eid | DATA |
+------+-----------+
| 1 | lara lara |
| 1 | qewrqer | *** archivo de eid 3
| 2 | asdfasdf |
| 2 | lara lara |
| 3 | qewrqer | *** archivo de eid 3
+------+-----------+
6 rows IN SET (0,38 sec)
me tendría que devolver:
mysql> SELECT X lara lara;
+------+-----------+
| eid | DATA |
+------+-----------+
| 1 | lara lara | *** se repite
| 2 | asdfasdf |
| 2 | lara lara | *** se repite
+------+-----------+
1 rows IN SET (0 sec)
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
lo conseguí!!!! :xD esta es la sentencia:
SELECT * FROM ejemplo WHERE (DATA) NOT IN (SELECT DATA FROM ejemplo WHERE eid =X) GROUP BY DATA
S2
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).
Cita de: Anibal784 en 20 Mayo 2009, 04:27 AMSi 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
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
Hola, Si Solo Necesitas el campo DATA , solo coloca DATA en lugar de *, con esto te deberia de funcionar en MSSQL.
SELECT DATA FROM ejemplo WHERE (DATA) NOT IN (SELECT DATA FROM ejemplo WHERE eid =X) GROUP BY DATA
Saludos
Miguel Angel