2012-08-12 66 views
1

目前,我有一個SQL查詢,看起來最多可以接受的比賽,然後用它們進行排序:我怎麼可以把一個函數ORDER內部。通過ABS(

ORDER BY ABS (itemranking - $rating)

是否有可能以某種方式修改「項排名「作爲查詢被處理,使得條件可以添加說像:

if (category == '$category')

減去1從物品的ABS;

THEN ORDER BY ABS

我不確定這是否是對知道正確代碼的人的快速回答,或者它是一個更大的概念「我怎樣才能達到這個結果」類型的問題。

無論哪種方式,有一些上下文可能會有幫助。我們的目標是對一系列提交內容進行排序,以便它們匹配值「評級」,同時還可以提升用戶所需類別中的項目。

一個真實生活的例子(不是我的網站):購物網站可以提供一個過濾器,用於在價格方面搜索最接近的匹配,但表現爲特定類別內的所有商品(例如「紅色」)的價格爲10美元比賽實際上是比賽。

回答

1

爲什麼不使用以下類型的SQL,在ORDER BY表達式中使用CASE語句來動態地排序結果?

這是更多的面向SQL的解決方案,所以我不知道它是如何適用於您的問題。

SELECT * 
FROM Table 
ORDER BY CASE Category 
      WHEN '$category' THEN ABS(ItemRanking - $rating - 1) 
      ELSE ABS(ItemRanking - $rating) 
     END 
+0

我想我對PHP經常使用的函數之外的SQL不夠熟悉,無法理解到底發生了什麼。 因此,我添加一個特殊的情況下,似乎像一個if語句的功能。我想它是我失去的「其他」聲明。什麼時候「排名」被設置? – user187680 2012-08-12 02:17:28

+0

@ user187680:我修改了一下查詢來簡化它。我在ORDER BY子句中使用的CASE語句只不過是一組IF語句,在這種情況下,這些語句依賴於每行(Category和ItemRanking)中的字段以及本地PHP變量$ category和$ rating。從這個CASE語句返回的值是一個可以比較容易排序的直線數字。 – 2012-08-12 02:30:10

0

這樣做

Select if(category='$category', ABS (itemranking - $rating) - 1, ABS (itemranking - rating)) as calc 
FROM table 
ORDER BY calc 
0

正如已經metionned,在Select查詢使用的試驗條件爲使用Case語句來完成。除了已經給出的示例,代碼的其他一些例子可以是:

Order By ABS (itemranking - $rating) - 
    Case When category == '$category' Then 1 Else 0 End 

Order By ABS (Case when category == '$category' then (itemranking - $rating - 1) 
    Else (item - $rating) End) 

此外,如果你正在使用MySQL或MS-SQL Server或其他一些SQL你不提-服務器。一些可以正確使用MySQL的東西可能不適用於MS-SQL Server,反之亦然。

相關問題