2009-08-26 10 views
5

Ésta es la configuración:Seleccione de la tabla en función de las entradas en otra tabla

Tabla A tiene una conexión a la mesa hay varias entradas (0 a n) en la tabla B. B que puede tener un registro coincidente en la tabla A.

¿Cómo formulo una consulta que me da un registro de la tabla A solo si existe una cierta cantidad de registros coincidentes en la tabla B?

Ejemplo:

Table A has clothing in it. La Tabla B tiene atributos para la ropa.

Tabla B tiene una clave externa a la tabla A lo que sería algo como esto:

id fid_clothing1 attributeA 
id fid_clothing1 attributeB 
id fid_clothing1 attributeC 
id fid_clothing2 attributeA 
id fid_clothing2 attributeB 

Ahora, quiero sólo la ropa que tienen atribuir attributeA Y attributeB Y attributeC. Este no es un problema si hago un O-consulta, pero no puedo hacer algo como:

SELECT * from tableA 
LEFT JOIN tableB on tableB.fid_cloting = tableA.id 
WHERE attribute='A' AND attribute='B' AND attribute='C' 

esta condición nunca se evaluará como true. ¿Cómo puedo hacer eso?

+0

que debe utilizar en Clouse Creo que sí –

Respuesta

2

Se podía hacerlo con 3 combinaciones internas ... es decir, dame filas de una tabla que tienen los atributos que quiero

SELECT A.id FROM tableA A 
INNER JOIN tableB BA ON A.id = BA.fid_clothing AND BA.Attribute='A' 
INNER JOIN tableB BB ON A.id = BB.fid_clothing AND BB.Attribute='B' 
INNER JOIN tableB BC ON A.id = BC.fid_clothing AND BC.Attribute='C' 
GROUP BY A.id 
+2

El problema con esto es que se generaliza mal (lo que si su prenda de vestir tenía 99 atributos) ? – butterchicken

0

Puede ser éste .. tienes que probarlo

SELECT * FROM TABLEA a, TABLE b 
WHERE a.id = b.clothing_id 
AND a.id in (SELECT clothing_id from TABLEB where attribute = 'A' AND clothing_id = a.id 
UNION select clothing_id from TABLEB where attribute = 'B' AND clothing_id = a.id 
UNION select clothing_id from TABLEB where attribute = 'C' AND clothing_id = a.id) 
0

Otra forma de hacerlo es la siguiente, que requiere cero uniones, pero una subconsulta anidada ... ha intentado esto en una base de datos ficticia, y parece hacer el trabajo. Espero eso ayude.

 
SELECT * 
FROM tableA A 
WHERE id IN ( 
       SELECT clothing_id 
       FROM tableB B 
       WHERE 
       attribute = "A" 
       OR attribute = "B" 
       OR attribute = "C" 
       GROUP BY clothing_id 
       HAVING count(*) = 3 
      ) 
+1

Desea agregar una clave única en clothing_id, atributo solo en caso de que una camisa tenga dos pliegues – pjp

1

me gustaría utilizar GROUP_CONCAT a buscar una sola fila de todos los atributos de una determinada pieza de ropa:

SELECT id,GROUP_CONCAT(attribute order by attribute) as Attributes 
FROM tableB 
GROUP BY id; 

Dar algo como:

| id | Attributes | 
| 1 | A,B,C  | 

A partir de este conjunto de resultados, usted podría seleccione aquellos identificadores para los cuales el atributo concatenado coincide con el conjunto de atributos que estaba buscando.

seleccione ID de MyConcatenatedResults donde Atributos = 'A, B, C'

+0

Un poco va en contra de los principios de normalización, pero parece que debería hacer el trabajo. – pjp

Cuestiones relacionadas