0

テーブルに含まれるオブジェクトの ID を注文しようとしています。このために、「IN」句内の属性の順序に基づく次の階層を使用しています。

オーダーバイ

最初:すべての属性に一致する ID: 'Solid' と 'Metal' と 'Red'

2 番目:属性に一致する ID: 'Solid' および 'Metal'

3 番目:属性のみに一致する ID: 'Solid'

4 番目:属性に一致する ID: 'Metal' および 'Red'

5 番目:属性「Metal」のみに一致する ID

6 番目:属性「赤」にのみ一致する ID

私が使用している主なクエリは次のとおりです。

SELECT objectattributelink.ID, COUNT(*) Attributes
FROM objectattributelink, attributelist
WHERE objectattributelink.ID = attributelist.AttributeID
AND attributelist.AttributeDesc IN ('Solid', 'Metal', 'Red')
AND objectattributelink.AttributeID BETWEEN 1000 AND 1200
GROUP BY objectattributelink.ID
ORDER BY COUNT(*) DESC

これは、すべての ID を単純化された順序で返します。この場合、一番上のもの (3 つの属性に一致するもの) は問題ありませんが、残りの順序はランダムです。

私の現在のソリューションは 6 つの異なるクエリを実行していますが、1 つのクエリで実行できるかどうかを知りたいです。

私が基本的に各クエリに対して行っていることは次のとおりです。

1 つ: IN ('Solid', 'Metal', 'Red') および HAVING Attributes = 3、2 つ目: IN ('Solid', 'Metal') および HAVING Attributes = 2、3 つ目: IN (' Solid')、4 つ目: IN ('Metal', 'Red') および HAVING Attributes = 2、5 つ目: IN ('Metal') および 6 つ目は IN ('Red')

4

1 に答える 1

0

次のクエリは順序付けを行います。

SELECT oal.ID, COUNT(*) Attributes
FROM objectattributelink oal join
     (select al.*,
             (case when AttributeDesc = 'Solid' then 1 else 0 end) as IsSolid,
             (case when AttributeDesc = 'Metal' then 1 else 0 end) as IsMetal,
             (case when AttributeDesc = 'Red' then 1 else 0 end) as IsRed
      from attributelist al
     ) al
     on oal.ID = al.AttributeID
where al.AttributeDesc IN ('Solid', 'Metal', 'Red')
AND oal.AttributeID BETWEEN 1000 AND 1200
GROUP BY oal.ID
ORDER BY (case when max(IsSolid) = 1 and max(IsMetal) = 1 and max(IsRed) = 1 then 1
               when max(IsSolid) = 1 and max(IsMetal) = 1 then 2
               when max(IsSolid) = 1 then 3
               when max(IsMetal) = 1 and max(IsRed) = 1 then 4
               when max(IsMetal) = 1 then 5
               when max(IsRed) = 1 then 6
          end);

ロジックの記述を容易にするために、クエリは値ごとに 3 つの新しい変数を導入します。次に、max()関数は、グループにそれらの変数があるかどうかを判断します。

また、句を使用するように結合構文を修正し、on読みやすくするためにテーブル エイリアスを導入しました。

編集:

次を使用して行うこともできると思いますorder by

order by max(IsSolid) * 4 + max(IsMetal) * 2 + max(IsRed);
于 2013-08-15T01:08:42.400 に答える