0

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

我怎样才能做到这一点。我在谷歌上搜索过,在 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

提前感谢您的帮助。

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

如果一个领域的优先级更高——比如一辆红色汽车,你甚至可以按顺序比另一个领域赋予更多的权重……所以设施 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 回答