Приоритеты в запросе SELECT в SQL - PullRequest
0 голосов
/ 16 декабря 2011

Это, вероятно, плохой пример, но я думаю, что это довольно просто. Допустим, поисковая система (например, Google ) извлекает результаты (ссылки на веб-сайты) поиска, выполненного пользователем, и он должен упорядочивать их в соответствии с заданным приоритетом языков и * 1004. * страны одновременно. Скажем,

Языковые приоритеты

 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?

Ответы [ 3 ]

1 голос
/ 16 декабря 2011

Это мысленный эксперимент, поэтому большой ответ: «Это зависит». Если вы действительно хотите усложнить ситуацию, вы также будете знать о геолокации этого человека (или, по крайней мере, о географической привязке к этим сумасшедшим экспатриантам) и языке.

В любом случае, вы, по крайней мере, будете иметь отношение многие ко многим между языком и страной (например, в США будет английский и испанский). Затем вы бы отсортировали по языковым предпочтениям и , а затем стране (потому что, как носитель английского языка, я гораздо больше заинтересован в английских сайтах из Великобритании, чем в испанских сайтах из США).

Итак, у вас будет таблица URL, затем таблица Country, а затем таблица Language. Вы могли бы иметь рейтинг в вашей языковой таблице, если бы у вас на самом деле были предпочтения пользователя - Google бы этого не сделал, так как они международные. У вас были бы страны, перечисленные по широтам и долготе, и тогда вы могли бы сделать простые расчеты расстояния в вашем заказе, чтобы добраться до ближайших стран, как вы. Или, если вам нужны пользовательские отношения, вы можете предоставить таблицу сопоставления Страна-Страна, в которой страны будут сопоставляться с его кузенами (например, из США в Великобританию).

Но на самом деле Google этого не делает. Они ищут релевантность вашего запроса (они могут проанализировать, на каком языке он основан на их существенном механизме перевода), а затем возвращают их вам на основе целого ряда переменных. Они делают это не с простым моделированием реляционных баз данных, а с довольно сложным статистическим анализом.

В качестве предположения (я не работаю в Google) ваши ссылки получают релевантность баллу запроса и релевантность вашему баллу. Затем результаты упорядочиваются по сумме двух по убыванию. Он очень быстро вычисляет эти значения на основе уже имеющихся статистических моделей (он просто вводит ваши значения и получает результат - модели интеллектуального анализа данных могут делать это предсказание невероятно быстро, поскольку компиляция модели занимает гораздо больше времени).

1 голос
/ 16 декабря 2011

Предполагая, что языки и страны находятся в своих собственных таблицах и что таблица веб-сайтов ссылается на эти два, вы 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 голосов
/ 16 декабря 2011

В ваших таблицах должны быть определены эти приоритеты, поэтому в языковой таблице будет столбец приоритетов, а в таблице стран также будет столбец приоритетов, тогда вы будете использовать их в своем заказе по предложению. Есть ли ограничение, когда вы не можете добавить эти столбцы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...