2011-12-16 127 views
0

這可能是一個不好的例子,但我認爲它很簡單。 讓我們假設一個網絡搜索引擎(如Google)正在檢索用戶執行搜索的結果(鏈接到網站),並且它應該根據語言國家的給定優先級同時對它們進行排序。再說了,SQL中SELECT查詢的優先級

語言優先

1. English 
2. Spanish 
3. Italian 
... 

國家重點

1. USA 
2. England 
3. Canada 
4. Spain 
5. Mexico 
... 

那麼,結果將是什麼樣訂購

Websites in english and from the USA 
Websites in spanish and from the USA or in english and from England 

... 

Websites in italian and from Mexico (?). 

SELECT url FROM websites 
WHERE (
language = english 
OR language = spanish 
OR language = italian 
) AND (
country = USA 
OR country = England 
OR country = Canada 
OR country = Spain 
OR country = Mexico) 
查詢

顯然不起作用,因爲它提供了一個條件,而不是優先級。使用ORDER BY languageORDER BY timezone將不起作用,因爲它按字母順序排列。那麼,在SQL中如何解決這個問題呢?

回答

1

假設語言和國家都在自己的表和網站引用表中的這兩個,你order by兩個持有每個表的優先領域..

SELECT 
    wesbites.url 
FROM 
    websites 
    INNER JOIN languages on websites.languageId = languages.id 
    INNER JOIN countries on websites.countryId = countries.id 
ORDER BY 
    languages.priority, 
    countries.priority 
+0

+1,但我會將`ORDER BY`子句概括爲'ORDER BY表達式(languages.priority,countries.priority)` – newtover 2011-12-16 12:36:23

0

你的表格必須確定這些優先事項,所以語言表將具有優先級列和貴國表也將有一個優先列,那麼你會被子句中使用那些在您的訂單。有沒有限制,你不能添加這些列?

1

這是一個思想實驗,所以答案是一個很大的,「這要看情況。」如果你真的使事情變得複雜,那麼你也知道,人的地理位置(或至少geopreference對於那些瘋狂的外國人)和語言。

無論如何,你至少有語言和國家之間的許多一對多的關係(例如,美國將有英語和西班牙語)。然後你會根據語言偏好排序,然後,然後國家(因爲作爲英語發言者,我對來自英國的英語網站比我在美國的西班牙語網站更感興趣)。

所以,你有一個URL表則國表,然後語言表。如果您確實有用戶偏好,您可以在語言表中擁有排名 - Google不會這樣做,因爲它們是國際化的。您將有Lat和Long列出的國家/地區,然後您可以按順序在您的訂單中進行簡單的距離計算,以便像您一樣到達最近的國家/地區。或者,如果您想要定製關係,您可以提供一個國家/地區映射表,將國家映射到其表兄弟(例如 - 美國到英國)。

但實際上,Google並沒有這樣做。他們搜索你的查詢的相關性(他們可以根據他們的實質性翻譯引擎來解析它的語言),然後根據整個變量將它們反饋給你。他們不是用簡單的關係數據庫建模來做這件事,而是做複雜的統計分析。由於猜想(我不在Google工作),您的鏈接會與查詢分數和與您的分數相關性相關。然後結果通過兩者的總和排序。它基於已有的統計模型非常快速地計算這些事情(它只是簡單地插入您的值並獲得結果 - 數據挖掘模型可以非常快速地完成此預測,因爲編譯模型需要更長的時間)。