0

DB でクエリを実行し、約 500 の結果を取得する演習を行っています。今、いくつかの条件に基づいてこのリストをソートし、ソートされたリストをクライアント側に表示したいと考えています。Java/Java EE と MySQL サーバー 5.5 を使用しています。条件は次のとおりです。例: 車がリストされているテーブルを考えてみましょう。テーブルに対してクエリを実行すると、約 500 台の車がリストされます。ここで、ユーザーの基準に基づいてこのリストを並べ替えたいと思います。条件は車の年式、車の色、車の設備です。リストは次のように並べ替える必要があります。最初に、3 つの条件すべてを満たす車のリストが表示されます。つまり、エンド ユーザーが言及したのと同じ年式で、同じ色で、ユーザーが選択したすべての設備を備えています。2 つ目は、車のリストを満たす 2 つの条件と満たさない 1 つの条件のいずれかです。3 番目は、cars リストを満たすいずれか 1 つの条件が表示され、他の 2 つは表示されません。

どうすればこれを達成できますか。私はグーグルで検索し、これに関してircチャンネルで尋ねました。何の助けも得られませんでした。CASES を定義して RANK 関数を使用し、最後に RANK で並べてみました。条件フィールド(列)が同じテーブルのものである間、それは私にとってはうまくいきます。私の場合、フィールドは親テーブルと、親と多対1の関係を持つ子テーブルからのものです。この例のように、車の年式と色は親テーブルに格納され、車が持つ設備は別のテーブルに格納されます。内部結合を使用して同じことを試みましたが、うまくいきませんでした。

私はこのようなことを試しました:

クエリ:

select distinct t0.id,t0.name,t0.price,
CASE
WHEN   
t1.age='2' AND t1.colour='Red'  AND t2.facilities_id=9 THEN 1
WHEN   
 t1.age='2' AND t1.colour='Red' AND t2.facilities_id!=9  THEN 2 
WHEN  
t1.age='2' AND t1.colour!='Red'  AND t2.facilities_id=9  THEN 3
WHEN   
t1.age!='2' AND t1.colour='Red'  AND t2.facilities_id=9  THEN 4
WHEN   
t1.age!='2' AND t1.colour='Red'  AND t2.facilities_id!=9  THEN 5
WHEN   
t1.age='2' AND t1.colour!='Red'  AND t2.facilities_id!=9  THEN 6
WHEN   *
t1.age!='2' AND t1.colour!='Red'  AND t2.facilities_id=9  THEN 7
ELSE 8
END as pre_status
from cars_listing t0
inner join
cars_listing_details t1
on t0.id=t1.mg_listing_id
inner join
cars_facilities_listing t2 
on t1.cars_listing_id=t2.listing_id
where t0.type='new_cars'
order by pre_status

助けてくれてありがとう。

4

2 に答える 2

3

のようなもので注文してみてください...

order by
   case when first_condition then 1 else 0 end
  + case when second_condition then 1 else 0 end
  + case when third_condition then 1 else 0 end  DESC



select distinct 
      t0.id,
      t0.name,
      t0.price,
      case when t1.age = '2' then 1 else 0 end as MatchedAge,
      case when t1.colour='Red' then 1 else 0 end as MatchedColor,
      case when t2.facilities_id = 9 THEN 1 else 0 end as MatchedFacility
   from 
      cars_listing t0
         inner join cars_listing_details t1
            on t0.id = t1.mg_listing_id
            inner join cars_facilities_listing t2 
               on t1.cars_listing_id = t2.listing_id
   where 
      t0.type = 'new_cars'
   order by 
        case when t1.age = '2' then 1 else 0 end
      + case  when t1.colour='Red' then 1 else 0 end
      + case when t2.facilities_id = 9 THEN 1 else 0 end DESC

赤い車など、1 つのフィールドの優先度が高い場合は、次の順序で他のフィールドよりも重み付けすることもできます...したがって、施設 5 の赤い車は、施設 9 の青い車の前に表示されます。順序を次のように変更する

   order by 
        case when t1.age = '2' then 1 else 0 end
      + case  when t1.colour='Red' then 5 else 0 end  <-- applyi higher Wgt to color match vs other criteria
      + case when t2.facilities_id = 9 THEN 1 else 0 end DESC
于 2013-02-25T12:01:18.230 に答える
0

さて、私は私のプロジェクトで動的SQLのwhere条件を実行しました。それはあなたを助けるかもしれません。SELECTクエリのストアドプロシージャを作成しました。(私はSQL Server 2008 R2でそれを行いました)。さらにサポートが必要な場合は教えてください。

USE [DATABASE_NAME]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[PROCEDURE_NAME]
@Id int = NULL,
@Requester varchar(20) = NULL,
@Suggester varchar(20) = NULL
AS
BEGIN
    DECLARE @sql nvarchar(4000)

    SELECT @sql='SELECT Id, Suggester, Requester from DATABASE_NAME.dbo.TABLE_NAME WHERE 1=1 '
    If (@Id) IS NOT NULL
            SELECT @sql=@sql + ' AND Id=(@Id) '
    If (@Suggester) IS NOT NULL
            SELECT @sql=@sql + ' AND Suggester like (@Suggester) '
    If (@Requester) IS NOT NULL
            SELECT @sql=@sql + ' AND Requester like (@Requester) '
    EXEC sp_executesql @sql, N'@id int, @Requester varchar(20), @Suggester varchar(20)', 
                   @Id, @Requester, @Suggester
END

GO

このSPでは; Id、Requester、Suggesterはフィールド名です。

于 2013-02-25T12:15:41.427 に答える