2013-02-25 108 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

相關問題