2012-12-26 10 views
6

Ho una tabella mysql T1 composta da due colonne di INT che collega un car_id a un part_id. Un singolo car_id può avere più part_id, e lo stesso part_id può corrispondere a più di un car_id. Ad esempio,MySQL Selezione tra QUALSIASI e TUTTO

car_id part_id 
    1  1 
    1  2 
    1  8 
    2  3 
    3  4 
    4  2 
    4  6 
    ... 
    10  1 
    10  2 
    ... 
    20  1 
    20  2 
    20  8 

per ottenere tutti i part_ids associati car_id = 1, che esegue la query,

SELECT car_id, part_id FROM T1 WHERE car_id=1 

e ottenere il risultato:

car_id part_id 
    1  1 
    1  2 
    1  8  

Ora, voglio trova tutti i rimanenti car_ids che contengono almeno (say> = 2/3) dei part_ids associati a car_id = 1. (In questo esempio, dovrei ottenere tutti i car_id che hanno almeno 2 dei part_ids 1,2 e 8 come mostrato dopo la mia query SELECT. Quindi, dovrei ottenere car_ids 1,10 e 20).

posso trovare le car_ids che contengono Tutti i part_ids 1,2, e 8 con:

SELECT car_id, part_id 
     FROM T1 
     WHERE part_id = ALL (SELECT part_id FROM T1 WHERE car_id=1). The result is car_ids 1 and 20. 

posso trovare le car_ids che contengono uno dei valori 1,2, e 8 utilizzando:

SELECT car_id, part_id 
     FROM T1 
     WHERE part_id = ANY (SELECT part_id FROM T1 WHERE car_id=1). The result is car_ids 1,4,10 and 20. 

Come specificare un numero tra QUALSIASI e TUTTO?

+0

dire ciò che ci si aspetterebbe per il risultato. scrivi il risultato desiderato –

risposta

1

di ottenere tutti car_id s che hanno 2 o più auto 1 s' part_id s fare

SELECT car_id, 
     group_concat(part_id) as part_ids 
FROM T1 
WHERE part_id in (SELECT part_id FROM T1 WHERE car_id = 1) 
group by car_id 
having count(distinct part_id) >= 2 
+0

Questo ha funzionato alla grande, grazie. – user1930297

0

Ecco un modo:

select car_id 
from (select cp.car_id, 
      sum(case when cp.part_id is not null and cp1.part_id is not null then 1 else 0 end) as PartsInCommon, 
      sum(case when cp.part_id is not null and cp1.part_id is null then 1 else 0 end) as ThisCarOnly, 
      sum(case when cp.part_id is null and cp1.part_id is not null then 1 else 0 end) as ThatCarOnly 
     from CarParts cp full outer join 
      (select part_id 
      from CarParts cp 
      where car_id = 1 
      ) cp1 
      on cp.part_id = cp1.part_id 
     group by cp.car_id 
    ) t 
where PartsInCommon/(PartsInCommon + ThisCarOnly + ThatCarOnly) >= 2.0/3 

Questa query conta il numero di parti comuni di entrambe le auto o in una o l'altra. La clausola where definisce quindi la condizione particolare.

Se si desidera l'elenco delle parti, Juergen ha l'idea giusta con lo group_concat(), anche se non lo si specifica nella domanda.

0

Prova questa query. Ho cercato, per quanto posso

SELECT 
    car_id, 
    GROUP_CONCAT(part_id) 
FROM cars 
WHERE FIND_IN_SET 
    (part_id ,(SELECT GROUP_CONCAT(part_id) FROM cars WHERE car_id = 1)) 
GROUP BY car_id 
HAVING COUNT(part_id) >= 2 

Ecco la demo sqlfiddle http://sqlfiddle.com/#!2/8e563/17