这可能是一个不好的例子,但我认为这很简单。 假设一个网络搜索引擎(例如Google)正在检索用户执行搜索的结果(链接到网站),并且应该根据给定的语言优先级和对它们进行排序。国家在同一时间。说,
语言优先级
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 language
或ORDER BY timezone
也无效,因为它按字母顺序排序。那么,在SQL中最好的解决方法是什么?
答案 0 :(得分:1)
这是一个思想实验,所以答案很大,“这取决于”。如果你真的希望使事情变得复杂,那么你也会意识到那个人的地理定位(或者至少是那些疯狂的外派的地理参考)和语言。
无论如何,你至少在语言和国家之间有多对多的关系(例如,美国会有英语和西班牙语)。然后你会按语言偏好和然后国家排序(因为作为英语发言人,我对来自英国的英语网站比对来自美国的西班牙语网站更感兴趣。)
因此,您有一个URL表,然后是Country表,然后是Language表。如果你真的有用户偏好,你可以在你的语言表中排名 - 谷歌不会这样做,因为它们是国际性的。您有Lat和Long列出的国家/地区,然后您可以在订单中进行简单的距离计算,以便到达最近的国家/地区。或者,如果您想要自定义关系,您可以提供一个国家/地区映射表,将国家映射到其堂兄弟(例如美国到英国)。
但实际上,Google并没有这样做。他们搜索您的查询的相关性(他们可以根据他们的实质性翻译引擎解析它的语言),然后根据一大堆变量将这些语言反馈给您。它们不是通过简单的关系数据库建模来实现的,而是复杂的统计分析。
作为猜想(我不在谷歌工作),您的链接与查询得分以及与您得分的相关性相关。然后通过两者的总和来对结果进行排序。它基于已经存在的统计模型非常快速地计算这些事物(它只是插入你的值并得到结果 - 数据挖掘模型可以非常快地完成这个预测,因为编译模型需要更长的时间)。
答案 1 :(得分: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
答案 2 :(得分:0)
您的表必须定义这些优先级,因此语言表将具有优先级列,您的国家/地区表也将具有优先级列,然后您将在order by子句中使用这些列。是否存在无法添加这些列的限制?