2011-12-29 14 views
1

すべてのn制約を満たすエンティティを取得したい私はそれらを与えます。MySQLの交差点を設定する:きれいな方法

UN操作は、UNIONで実行できます。私はMySQLがINTERSECTをサポートしているかどうかこの質問をしなかった。

テーブル内のエンティティとその属性が* subject_attribute *にあります。

私はネストされたクエリとして唯一の道と操作を参照してください。

SELECT id 
FROM subject_attribute 
WHERE attribute = 'des_sen' 
AND numerical_value >= 2.0 
AND id 
IN (
    SELECT id 
    FROM subject_attribute 
    WHERE attribute = 'tough' 
    AND numerical_value >= 3.5 
) 

これが意味しますようにと「高いクエリを満たす合格者を排除、その後、最低のサブクエリを満たすエンティティをフェッチ」。


rows(condn x) AND rows(condn y) AND rows(cond z) <--ideal 
rows(condn x:rows(cond y:rows(cond z))) <-- I am stuck here 

私は

  1. にしたいと私は直線的な条件をチェーンの代わりに、それらをネスト好むプログラム的

よりよいそれらをデバッグするクエリを作成私の質問:個の個別のクエリが与えられていますが、どのようにそれらをきれいに直線的にMySQLでどうやって結び付けるのですか?

ネストされたクエリまたはストアドプロシージャを使用していません。

個々のクエリについての部分に注意してください。


更新:ジョナサン・レフラーは、右のそれを答えました。 Mark Ba​​nnisterの答えははるかに単純です(しかし、私はいくつかの悪い決定をしました)。あなたがまだ結合に混乱している場合、私の答えを参照してください。

+0

クエリにテーブル構造を含めることはできますか? –

答えて

2

SELECT id 
FROM subject_attribute 
WHERE (attribute = 'des_sen' AND numerical_value >= 2.0) or 
     (attribute = 'tough' AND numerical_value >= 3.5) or 
... 
group by id 
having count(distinct attribute) = N; 

- ここでNは、attribute-numeric_value条件ペアの数です。

1

INNER JOIN(または単にJOIN)が必要な交差点ではありませんか?関連する共通の列に結合すると仮定します。したがって

SELECT s1.id 
    FROM (SELECT id 
      FROM subject_attribute 
     WHERE attribute = 'des_sen' 
      AND numerical_value >= 2.0 
     ) AS s1 
    JOIN (SELECT id 
      FROM subject_attribute 
     WHERE attribute = 'tough' 
      AND numerical_value >= 3.5 
     ) AS s2 
    ON s1.id = s2.id 

これはきれいに直線Nクエリー(N> 2)まで延びています。


あなたはそれを拡張する方法を説明してください。ケース誰に

SELECT s1.id 
    FROM (SELECT id 
      FROM subject_attribute 
     WHERE attribute = 'des_sen' 
      AND numerical_value >= 2.0 
     ) AS s1 
    JOIN (SELECT id 
      FROM subject_attribute 
     WHERE attribute = 'tough' 
      AND numerical_value >= 3.5 
     ) AS s2 
    ON s1.id = s2.id 
    JOIN (SELECT id 
      FROM subject_attribute 
     WHERE attribute = 'though' 
      AND numerical_value = 14 
     ) AS s3 
    ON s1.id = s3.id 
    JOIN (SELECT id 
      FROM subject_attribute 
     WHERE attribute = 'through' 
      AND numerical_value != 45 
     ) AS s4 
    ON s1.id = s4.id 
    JOIN (SELECT id 
      FROM subject_attribute 
     WHERE attribute = 'plough' 
      AND numerical_value < 9 
     ) AS s5 
    ON s1.id = s5.id 
    JOIN (SELECT id 
      FROM subject_attribute 
     WHERE attribute = 'cough' 
      AND numerical_value < 5 
     ) AS s6 
    ON s1.id = s6.id 
    JOIN (SELECT id 
      FROM subject_attribute 
     WHERE attribute = 'bucolic' 
      AND numerical_value >= 3.5 
     ) AS s7 
    ON s1.id = s7.id 
    JOIN (SELECT id 
      FROM subject_attribute 
     WHERE attribute = 'set' 
      AND numerical_value BETWEEN 0.23 AND 3.0 
     ) AS s8 
    ON s1.id = s8.id 
    JOIN (SELECT id 
      FROM subject_attribute 
     WHERE attribute = 'intelligent' 
      AND numerical_value >= 0.001 
     ) AS s9 
    ON s1.id = s9.id 
    JOIN (SELECT id 
      FROM subject_attribute 
     WHERE attribute = 'anal-retentive' 
      AND numerical_value < 7 
     ) AS s10 
    ON s1.id = s10.id 
    JOIN (SELECT id 
      FROM subject_attribute 
     WHERE attribute = 'magnificent' 
      AND numerical_value = 35 
     ) AS s11 
    ON s1.id = s11.id 
    JOIN (SELECT id 
      FROM subject_attribute 
     WHERE attribute = 'quantum' 
      AND numerical_value >= 55 
     ) AS s12 
    ON s1.id = s12.id 
    JOIN (SELECT id 
      FROM subject_attribute 
     WHERE attribute = 'thoughtfulness' 
      AND numerical_value >= 350.237 
     ) AS s13 
    ON s1.id = s13.id 
    JOIN (SELECT id 
      FROM subject_attribute 
     WHERE attribute = 'calamity' 
      AND numerical_value = 3.0 
     ) AS s14 
    ON s1.id = s14.id 
    JOIN (SELECT id 
      FROM subject_attribute 
     WHERE attribute = 'pink' 
      AND numerical_value > 0.5 
     ) AS s15 
    ON s1.id = s15.id 
    JOIN (SELECT id 
      FROM subject_attribute 
     WHERE attribute = 'cornucopia' 
      AND numerical_value BETWEEN 1 AND 12 
     ) AS s16 
    ON s1.id = s16.id 
    JOIN (SELECT id 
      FROM subject_attribute 
     WHERE attribute = 'maudlin' 
      AND numerical_value < 3.625 
     ) AS s17 
    ON s1.id = s17.id 
    JOIN (SELECT id 
      FROM subject_attribute 
     WHERE attribute = 'triad' 
      AND numerical_value >= 1.723 
     ) AS s18 
    ON s1.id = s18.id 
    JOIN (SELECT id 
      FROM subject_attribute 
     WHERE attribute = 'ambient' 
      AND numerical_value >= 3.1 
     ) AS s19 
    ON s1.id = s19.id 
+0

あなたはそれをどのように拡張するのかを教えてください – aitchnyu

0

、いくつかのクエリを連結する方法について混乱している、ここで簡略化された表現である:<クエリ#1>

SELECT id 
FROM subject_attribute 
WHERE attribute = 'des_sen' 
AND numerical_value >= 2.0 

あろう

SELECT result1.id 
FROM (
<query #1> 
) AS result1 

INNER JOIN (
<query #2> 
) AS result2 
ON result1.id = result2.id 

INNER JOIN (
<query #3> 
) AS result3 
ON result1.id = result3.id 

これは自己結合と呼ばれ、自身にテーブルを結合します。ここで、result1、result2、result3は同じテーブルのエイリアスです。各別個のクエリが同じテーブルに対して実行して、それらの各々はattributeの異なる値にアクセスして、そのようなすべてのクエリに交差する最も簡単な方法は、フォームのものであるということであると仮定すると

+0

各結果行の一意のキーが同じフィールド 'id'に保持されている場合にのみ真です。 –

+0

Mark Ba​​nnisterさん、詳しく教えてください – aitchnyu

+0

あなたは、あなたの ''クエリについて詳しく述べてください。 –