按mysql中标记的出现顺序排序

时间:2014-09-28 15:44:53

标签: mysql sql

在过去的几天里我遇到了这个问题。我有用户'一个表中的标签(user_tags)和另一个表中的文章(crawler_results),我试图对文章进行排序,以便首先放置包含最多标签的文章。 / p>

你是怎么做到的? 这是我的代码:

    SELECT content
    FROM crawler_results articles
    INNER JOIN user_newspapers un
    ON un.newspaper_id = articles.newspaper_id
    WHERE un.user_id = '$user_id'

我不得不加入user_tags表,其中包含:

tag and user_id

编辑: 让我们说用户想要找到带有这些标签的文章:#stack和#overflow。首先显示包含大多数这些标签的文章。所以有一篇文章说:"堆栈溢出很棒"排名高于:"溢出很棒"。标签可以重复使用,例如:"溢出,溢出,溢出"算作3。 我想对文章进行排序,以便首先包含最多标签的文章。

这是如何实现的?我有四个表:crawler_results(我存储文章的地方),报纸(我存储报纸的地方),user_newspapers(我有newspaper_id和user_id)和user_tags(我有标签和user_id)。

我是否需要创建一个单独的表来存储文章中的所有单词,或者这可以通过SQL查询来完成?

我真的很感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

如果您只需要使用相关标签的数量对查询进行排序,请尝试以下查询:

SELECT title
    , c.name AS category
    , img_src
    , n.name AS newspaper_name
    , crawler_results.id AS id
    , crawler_results.content AS content
FROM crawler_results
INNER JOIN newspapers n ON n.id = crawler_results.newspaper_id
INNER JOIN categories c ON c.id = crawler_results.category
INNER JOIN user_newspapers un ON un.newspaper_id = n.id
INNER JOIN (SELECT ut.user_id
                ,COUNT(ut.tag) AS nb_tags
            FROM user_tags ut
            GROUP BY ut.user_id) t ON t.user_id = un.user_id
INNER JOIN user_categories uc ON uc.category_id = c.id
WHERE img_src != ''
    AND char_length(content) > 750
    AND active = '1'
    AND un.user_id = '$user_id'
GROUP BY title
ORDER BY category ASC, t.nb_tags DESC

如果结果不符合您的预期,请尝试澄清您的问题并最终提供您期望的数据示例。

希望这会有所帮助。