我有以下表格:
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
答案 0 :(得分:2)
Denis或Johan的答案都不正确。相反,你可以使用它:
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 :(得分:1)
今天感觉有点懒,所以我只想回答标题中的问题:
如何根据另一个表中的数据对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将无法知道两个表之间的关系是什么,也无法对字段进行排序。
答案 2 :(得分:1)
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
CORRECTION:
当LEFT JOIN
表中没有出现某些单词时,我使用了search
。但是,这些单词的重要性似乎适合0
而不是NULL
,因此SUM应更改为:
, SUM( i.in_description * COALESCE(s.importance, 0)
+ i.in_title * COALESCE(s.importance, 1)
)
答案 3 :(得分:0)
您的order by子句可以包含任何表中的字段:
select table1.*
from table1
join table2 using (table1_id)
order by table2.field, table1.field, etc.