基于多个条件排序

时间:2013-02-25 11:54:09

标签: sql

我正在做练习 我将在数据库上发出查询并获得500个结果。现在我想根据一些条件对此列表进行排序,并在客户端显示排序列表。 我正在使用Java / Java EE和MySQL服务器5.5 条件是这样的, 示例:考虑列出汽车的表格 因此,我将在桌面上发出一个查询,它将列出大约500辆汽车。现在我想根据用户标准对此列表进行排序。 条件是汽车的年龄,汽车的颜色和汽车的设施。列表应该像这样排序 首先出现满足所有三个条件的汽车列表,即,与最终用户提到的相同年龄,相同颜色以及用户选择的所有设施。 第二个出现满足汽车清单的任何两个条件和一个不满意的条件。 第三个出现满足汽车列表的任何一个条件,而不是其他两个。 最后出现了没有条件的汽车清单。

我怎样才能做到这一点。我在谷歌搜索过,在irc频道询问过这个问题。无法得到任何帮助。 我已经尝试通过定义CASES使用RANK函数,最后通过RANK命令。它适用于我,而条件字段(列)是同一个表。在我的例子中,字段来自父表以及与其父表具有多对一关系的子表。与此示例中一样,汽车的年龄和颜色存储在父表中,汽车所具有的设施存储在另一个表中。我尝试使用内连接做同样的事情,但没有运气。

我试过这样的事情:

查询:

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

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

尝试通过类似的东西订购......

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

如果一个领域的优先级更高 - 例如红色汽车,你甚至可以在订单中给予比另一个更多的重量......所以工厂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

答案 1 :(得分:0)

好吧,我已经在我的项目中完成了动态sql的条件。它可能对你有帮助。我已经为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是字段名称。