6

car_id を part_id にリンクする INT の 2 つの列で構成される mysql テーブル T1 があります。1 つの car_id に複数の part_id を含めることができ、同じ part_id を複数の car_id に対応させることができます。例えば、

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  

car_id = 1 に関連付けられたすべての part_id を取得するために、次のクエリを実行します。

SELECT car_id, part_id FROM T1 WHERE car_id=1

そして結果を得る:

car_id   part_id
  1        1  
  1        2  
  1        8    

ここで、car_id=1 に関連付けられた part_id を少なくとも (>= 2/3) 含む残りの car_id をすべて見つけたいと考えています。(この例では、SELECT クエリの後に表示されるように、part_ids 1、2、および 8 のうち少なくとも 2 つを持つすべての car_ids を取得する必要があります。したがって、car_ids 1、10、および 20 を取得する必要があります)。

以下を使用して、part_ids 1、2、および 8 のすべてを含む car_ids を見つけることができます。

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.  

以下を使用して、値 1、2、および 8 のいずれかを含む car_ids を見つけることができます。

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.

ANY と ALL の間の数値を指定するにはどうすればよいですか?

4

3 に答える 3

1

carのdocar_idが 2 つ以上あるすべての を取得するには1part_id

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
于 2012-12-26T17:25:23.567 に答える
0

1 つの方法を次に示します。

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

このクエリは、両方の車またはいずれかの車に共通する部品の数をカウントします。次に、where句は特定の条件を定義します。

group_concat()パーツのリストが必要な場合は、質問でこれを指定していませんが、ユルゲンは で正しい考えを持っています。

于 2012-12-26T18:04:26.260 に答える
0

このクエリを試してください。私はできる限り試しました

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 

これがsqlfiddle Demo http://sqlfiddle.com/#!2/8e563/17です

于 2012-12-26T18:13:45.603 に答える