我正在做练习 我将在数据库上发出查询并获得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
提前感谢您的帮助。
答案 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是字段名称。