Как отсортировать элементы в MySQL на основе данных из другой таблицы? - PullRequest
0 голосов
/ 22 мая 2011

У меня есть следующие таблицы:

word_list:

id | word
1  | ball
2  | car 
3  | small

items_word_match:

itemid | wordid | in_title | in_description
1      | 1      | 1        | 0 //The word #1 occurs once in the title of the item 
1      | 3      | 0        | 2 //The word #3 occurs twice in the title of the item
3      | 3      | 1        | 2
2      | 1      | 1        | 0

поиск:

wordid | importance 
1      | 1
2      | 5 
3      | 2 //word #3 is more important than the word #1 but less so than word #2

Я хочу отсортировать элементы на основе ключевых слов из таблицы поиска и их важности.
И если ключевое слово в заголовке, важность должна увеличиться на 1, а если слово встречается в 2 раза, важность слова должна быть важностью * 2

Ответы [ 4 ]

2 голосов
/ 23 мая 2011

Ни один из ответов Дениса или Йохана не верен. Вместо этого вы можете использовать это:

select 
    itemid, 
    sum(word_importance) as item_importance
from
    (select 
        itemid, 
        search.wordid,
        (
            in_title * (importance + 1)
            + in_description * importance
        ) as word_importance
    from 
        items_word_match, 
        search 
    where 
        i.wordid = s.wordid 
    )
group by itemid

Как указал Йохан, вам нужно добавить в конец предложение порядка, , order by item_importance desc

1 голос
/ 23 мая 2011
SELECT
    i.itemid
  , SUM( i.in_description * s.importance 
       + i.in_title * ( s.importance + 1 )
       )
    AS item_importance
FROM
    items_word_match i
        LEFT JOIN
    search s
          ON s.wordid = i.wordid
GROUP BY
    i.itemid
ORDER BY
    item_importance DESC

ИСПРАВЛЕНИЕ:

Я использовал LEFT JOIN, уловил случай, когда некоторые слова не появляются в таблице search.Но тогда значение этих слов кажется уместным 0, а не NULL, поэтому СУММУ следует изменить на:

  , SUM( i.in_description * COALESCE(s.importance, 0) 
       + i.in_title * COALESCE(s.importance, 1) 
       )
1 голос
/ 22 мая 2011

Чувствую себя немного ленивым сегодня, поэтому я просто собираюсь ответить на вопрос в заголовке:

Как отсортировать элементы в MySQL на основе данных из другой таблицы?

Вы можете отсортировать результаты запроса по любому критерию.

SELECT word_list.* FROM word_list
INNER JOIN search ON (search.wordid = wordlist.id)
ORDER BY search.importance, word_list.id DESC

Обратите внимание, что JOIN, необходимый для связывания двух таблиц, может оказать глубокое влияние на то, какие строки в таблице word_list выбраны, но вам нужно как-то сделать JOIN.
В противном случае MySQL не будет знать, какова связь между двумя таблицами, и не сможет отсортировать поля.

0 голосов
/ 22 мая 2011

Ваш заказ может содержать поля из любой из таблиц:

select table1.*
from table1
join table2 using (table1_id)
order by table2.field, table1.field, etc.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...