2013-02-25 104 views
0

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

我该如何做到这一点。我在谷歌搜索,在这个问题在IRC频道问。无法获得任何帮助。 我曾尝试使用RANK函数通过定义CASES并最终按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 

预先感谢帮助。通过类似

+0

你想做类似动态选择查询哪些条件动态吗? – Dhwani 2013-02-25 12:02:14

+0

@djIT:如果我得到一个工作的静态查询,我会使它动态 – 2013-02-25 12:10:30

回答

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 
+0

感谢您的快速回复。我添加了我试过的查询。请看看它和建议。 – 2013-02-25 12:26:15

+0

@NakulSargur,对于延迟感到抱歉 - 您的“标准”到底是什么。年龄= 2,来自设施#9的红色汽车?即:每个例子有三个标准?并且是一个“加权”的优先级高于其他的(s) – DRapp 2013-02-25 13:01:45

+0

:我们在优先级标准中有10个过滤器。例如,正如我所提到的,用户将选择3个标准,如颜色,年龄和设施,比如AC(由9表示),我必须列出匹配所有3条标准的所有车辆,然后匹配任何2条标准... 1条件最后是没有任何符合他的标准的汽车。 – 2013-02-26 04:43:46

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 @[email protected] + ' AND Id=(@Id) ' 
    If (@Suggester) IS NOT NULL 
      SELECT @[email protected] + ' AND Suggester like (@Suggester) ' 
    If (@Requester) IS NOT NULL 
      SELECT @[email protected] + ' AND Requester like (@Requester) ' 
    EXEC sp_executesql @sql, N'@id int, @Requester varchar(20), @Suggester varchar(20)', 
        @Id, @Requester, @Suggester 
END 

GO 

在这里SP; Id,请求者,提示者是字段名称。

+0

感谢您的回答。但是我需要像DRapp提到的那样的查询。如果你可以帮助我查询,例如我已经在我的问题中发布了两个或三个字段,我会使它成为'n'字段的动态字段。我只需要一个可用的静态查询。 – 2013-02-25 12:25:08

+0

@NakulSargur,你可以结合我的和DRapp的编码并进行查询。只需在不同的情况下使用不同的select语句。而已。 – Dhwani 2013-02-25 12:29:36

相关问题