2011-10-14 13 views
6

Tengo una tabla likes, donde ID1 le gusta ID2columna común amigo, seleccione un par sola vez

ID1  ID2 
1025 1101 
1247 1468 
1316 1304 
1501 1934 
1641 1468 
1689 1709 
1709 1689 
1782 1709 
1911 1247 
1934 1501 

así que estoy seleccionar aquellos que les gusta el uno al otro, es ejemplo

1501 1934 
1934 1501 

Pero Quiero seleccionar cada par solo una vez, y no puedo hacerlo. ¿Alguien puede señalarme en la dirección correcta? es parte de una consulta más grande, pero esta parte no puedo hacerla.

Gracias

Respuesta

6

Para obtener una lista distinta de todos los gustos recíprocos puede utilizar

SELECT ID1, 
     ID2 
FROM likes L1 
WHERE ID1 > ID2 
     AND EXISTS(SELECT * 
        FROM likes L2 
        WHERE L1.ID1 = L2.ID2 
         AND L1.ID2 = L2.ID1) 
+0

buena solución. Probablemente también intentaré limpiar la tabla y hacer que las inserciones futuras siempre hagan ID1

+0

@TomH - Sí. Por supuesto, no hay garantía de que, como a A le gusta B, lo contrario también es cierto. –

+0

Muchas gracias, tuve que modificar un poco para encajar en mi solución, pero esto funcionó :) – Pheonix

0
select 
    L1.ID1, L1.ID2 
from likes L1 
where exists 
    (select 1 
     from likes L2 
     where L1.ID1 = L2.ID2 and L1.ID2 = L2.ID1) 
0

especificar los datos:

SELECT ID1, ID2 
    FROM likes 
WHERE ID1 < ID2 
UNION 
SELECT ID2 AS ID1, ID1 AS ID2 
    FROM likes 
WHERE ID1 > ID2; 

... entonces reparar la fuga de agregar restricciones de integridad de datos a la tabla, por ejemplo

CREATE TABLE likes 
(
ID1 INTEGER NOT NULL, 
ID2 INTEGER NOT NULL, 
CHECK (ID1 < ID2), 
UNIQUE (ID1, ID2) 
); 
+0

Has olvidado un paso. Arregle la aplicación para que no emita errores cada vez que intente insertar los ID en las columnas incorrectas. –

0
SELECT L1.ID1, L1.ID2 FROM Likes L1, Likes L2 
WHERE L1.ID1=L2.ID2 AND L1.ID2=L2.ID1 AND L1.ID1>L1.ID2 
Cuestiones relacionadas