10

これはこの質問と密接に関連していますが、別の要件が追加されています。

親テーブル 'parent' が与えられた場合

╔════════════╦════════╗
║ PARENT_ID  ║ NAME   ║
╠════════════╬════════╣
║         1  ║ bob    ║
║         2  ║ carol  ║
║         3  ║ stew   ║
╚════════════╩════════╝

親と (ここでは未指定の) プロパティ テーブルとの間の多対多関係テーブル 'rel'

╔════════════╦══════════╗
║ PARENT_ID  ║ PROP_ID  ║
╠════════════╬══════════╣
║         1  ║       5  ║
║         1  ║       1  ║
║         2  ║       5  ║
║         2  ║       4  ║
║         2  ║       1  ║
║         3  ║       1  ║
║         3  ║       3  ║
╚════════════╩══════════╝

指定された一連の関係のみを持つすべての親を選択するにはどうすればよいですか? たとえば、サンプル データを使用して、正確にプロパティ 5 と 1 との関係を持つすべての親を見つけるにはどうすればよいでしょうか?

4

10 に答える 10

13
SELECT PARENT_ID
FROM rel
GROUP BY PARENT_ID
HAVING SUM(PROP_ID NOT IN (5,1)) = 0
   AND SUM(PROP_ID = 1) = 1 
   AND SUM(PROP_ID = 5) = 1
于 2013-01-01T19:00:37.657 に答える
3

少なくとも5 と 1を持つすべての親を選択する場合は、次を使用できます。

SELECT PARENT_ID
FROM rel
GROUP BY PARENT_ID
HAVING SUM(PROP_ID = 1)
       AND SUM(PROP_ID = 5)
       AND SUM(PROP_ID NOT IN (5,1)) = 0

5と1が1つだけ必要な場合は、この回答を参照ください

于 2013-01-01T19:09:28.857 に答える
2
SELECT PARENT_ID
FROM rel
GROUP BY PARENT_ID
HAVING
  COUNT(PROP_ID)=2 AND
  COUNT(DISTINCT case when PROP_ID IN ( 1, 5 ) then PROP_ID end)=2

PARENT_IDこれにより、正確に 2 つの行があり、重複していない正確に 2 つの一致するすべてが選択されますPROP_ID

于 2013-01-01T19:48:17.490 に答える
1

(PARENT_ID, PROP_ID) が一意であると仮定します。

SELECT r1.PARENT_ID
FROM rel r1
INNER JOIN rel r2 ON r1.PARENT_ID = r2.PARENT_ID AND r2.PROP_ID = 5 
INNER JOIN rel r3 ON r1.PARENT_ID = r3.PARENT_ID AND r3.PROP_ID = 1
GROUP BY r1.PARENT_ID
HAVING COUNT(*) = 2

または、

SELECT parent.PARENT_ID
FROM parent
INNER JOIN
(
    SELECT PARENT_ID
    FROM rel
    WHERE PROP_ID IN (1,5)
    GROUP BY PARENT_ID
    HAVING COUNT(*) = 2
) good ON parent.PARENT_ID = good.PARENT_ID
LEFT OUTER JOIN rel bad ON parent.PARENT_ID = bad.PARENT_ID 
    AND bad.PROP_ID NOT IN (1,5)
WHERE bad.PARENT_ID IS NULL

あるいは、

SELECT DISTINCT parent.PARENT_ID
FROM parent
INNER JOIN rel r2 ON parent.PARENT_ID = r2.PARENT_ID AND r2.PROP_ID = 5 
INNER JOIN rel r3 ON parent.PARENT_ID = r3.PARENT_ID AND r3.PROP_ID = 1
LEFT OUTER JOIN rel r0 ON parent.PARENT_ID = r0.PARENT_ID 
    AND r0.PROP_ID NOT IN (1,5)
WHERE r0.PARENT_ID IS NULL
于 2013-01-01T18:58:18.857 に答える
0

このクエリは、(PARENT_ID、PROP_ID)が一意でない場合でも当てはまります。

SELECT PARENT_ID FROM rel WHERE
PROP_ID IN (5,1) AND 
PARENT_ID NOT IN (SELECT DISTINCT PARENT_ID FROM rel WHERE PROP_ID NOT IN (5,1))
GROUP BY PARENT_ID HAVING COUNT(DISTINCT PROP_ID) = 2
于 2013-03-03T06:15:25.850 に答える
0

MySql がサポートされている場合minus、クエリは次のようになります。

select parent_id
from rel
where prop_id in (5,1)
group by parent_id
having count(distinct prop_id)=2 and count(prop_id)=2
minus
select parent_id
from rel
where prop_id not in (5,1);

not in、(5,1) を超える関係を削除します (例: (5,1,3))。

あなたが MySql を使用していることは知っているので、私の答えは間違っています。別のアイデアとして受け取ってください。

于 2013-01-01T20:57:53.723 に答える
-1

これがあなたに役立つことを願っています:

SELECT p.PARENT_ID , r.PROP_ID FROM rel r LEFT JOIN parent p ON p.PARENT_ID = r.PARENT_ID WHERE r.PROP_ID = 5 OR r.PROP_ID = 1
于 2013-01-01T19:14:01.457 に答える