2012-12-26 38 views
6

Tôi có một bảng mysql T1 gồm hai cột INT liên kết một car_id với một part_id. Một car_id duy nhất có thể có nhiều part_ids và cùng một part_id có thể tương ứng với nhiều hơn một car_id. Ví dụ,MySQL Chọn giữa BẤT CỨ và TẤT CẢ

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 

Để có được tất cả các part_ids gắn liền với car_id = 1, tôi chạy truy vấn,

SELECT car_id, part_id FROM T1 WHERE car_id=1 

và nhận được kết quả:

car_id part_id 
    1  1 
    1  2 
    1  8  

Bây giờ, tôi muốn tìm tất cả các car_ids còn lại có chứa ít nhất (say> = 2/3) của các part_ids được liên kết với car_id = 1. (Trong ví dụ này, tôi sẽ nhận được tất cả các car_ids có ít nhất 2 trong số các part_ids 1,2 và 8 như được hiển thị sau truy vấn SELECT của tôi. Vì vậy, tôi sẽ nhận được car_ids 1,10 và 20).

Tôi có thể tìm car_ids chứa Tất cả các part_ids 1,2, và 8 sử dụng:

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. 

Tôi có thể tìm car_ids có chứa bất kỳ giá trị 1,2, và 8 sử dụng:

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. 

Làm cách nào để chỉ định một số số giữa BẤT K and VÀ TẤT CẢ?

+0

cho biết những gì u mong đợi cho kết quả. viết một kết quả mong muốn –

Trả lời

1

Để có được tất cả car_id s có 2 hoặc nhiều xe 1 's part_id s làm

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

Điều này làm việc tuyệt vời, cảm ơn. – user1930297

0

Dưới đây là một cách:

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 

Truy vấn này đếm số bộ phận chung cho cả hai xe ô tô hoặc trong một hoặc khác. Mệnh đề where sau đó xác định điều kiện cụ thể.

Nếu bạn muốn danh sách các phần, thì Juergen có ý tưởng đúng với group_concat(), mặc dù bạn không chỉ định điều này trong câu hỏi.

0

Thử truy vấn này. Tôi đã cố gắng nhiều như tôi có thể

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 

Đây là Demo sqlfiddle http://sqlfiddle.com/#!2/8e563/17

Các vấn đề liên quan