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

^Tifa^

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 (sql) [Seleccionar]


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 :

Código (sql) [Seleccionar]


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?

Karman

#11
bueno, trato de explicarlo con mi ejemplo inicial para ver si logro hacerme entender... tenemos esto:

Código (sql) [Seleccionar]

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):

Código (sql) [Seleccionar]

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:

Código (sql) [Seleccionar]

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):

Código (sql) [Seleccionar]

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:

Código (sql) [Seleccionar]

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

Karman

#12
lo conseguí!!!!  :xD esta es la sentencia:

Código (sql) [Seleccionar]
SELECT * FROM ejemplo WHERE (DATA) NOT IN (SELECT DATA FROM ejemplo WHERE eid =X) GROUP BY DATA

S2

Anibal784

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

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

Karman

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

Toxico

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

solo el principio....