【问题标题】:mysql - Search by search tags from junctional table, sort results by number of matches and put most matches on the top - solution?mysql - 通过连接表中的搜索标签搜索,按匹配数对结果进行排序并将大多数匹配放在顶部 - 解决方案?
【发布时间】:2019-12-04 21:36:14
【问题描述】:

我有一个包含三个表的关系数据库:

hieroglyphs           hieroglyph_has_search_tag           search_tags
-------------------   ---------------------------------   -------------------
| id | hieroglyph |   | hieroglyph_id | search_tag_id |   | id | search_tag |
-----+-------------   ---------------------------------   -------------------

我想创建一个查询,允许我使用一个或多个搜索标签搜索象形文字,按匹配数对结果进行排序和分组(匹配最多的象形文字应该在列表中排在第一位)和带有较少的搜索标签将占据较低的行。 这是结果应该如何显示的示例(输入的搜索标签:man, sitting, arms up):

+----+---------+
| A1 | man     |
| A1 | sitting |
| A1 | arms up |
| A2 | man     |
| A2 | sitting |
| A3 | man     |
+----+---------+

然后得到这样的东西:

+----+---+
| A1 | 3 |
| A2 | 2 |
| A3 | 1 |
+----+---+

这就是我使用 MySQL 查询的结果:

SELECT hieroglyphs.hieroglyph, search_tags.search_tag
FROM hieroglyph_has_search_tag
JOIN hieroglyphs ON hieroglyph_has_search_tag.hieroglyph_id = hieroglyphs.id
JOIN search_tags ON hieroglyph_has_search_tag.search_tag_id = search_tags.id
WHERE search_tag = "man" OR search_tag = "sitting" OR search_tag = "arms up"

我读到我应该使用COUNT()GROUP BYORDER BY,但我没有找到如何实现这些以使我的 MySQL 查询按我想要的方式工作的解决方案。我将不胜感激。

【问题讨论】:

    标签: mysql select count match sql-order-by


    【解决方案1】:

    您可以group by hieroglyph 并与 COUNT() 聚合,然后按该 COUNT() 降序排列:

    SELECT h.hieroglyph, COUNT(*) counter, 
      group_concat(s.search_tag) tags
    FROM hieroglyph_has_search_tag hs
    JOIN hieroglyphs h ON hs.hieroglyph_id = h.id
    JOIN search_tags s ON hs.search_tag_id = s.id
    WHERE s.search_tag IN ('man', 'sitting', 'arms up')
    GROUP BY h.hieroglyph
    ORDER BY counter desc
    

    请参阅demo
    结果:

    | hieroglyph | counter | tags                |
    | ---------- | ------- | ------------------- |
    | A1         | 3       | sitting,arms up,man |
    | A2         | 2       | man,sitting         |
    | A3         | 1       | man                 |
    

    【讨论】:

    • 这是一个完美的解决方案。它就像一个魅力。谢谢你。你知道我可以如何更进一步并在特定行的第三列连接搜索标签 - 对于A1,它将是man, sitting, arms up
    • 谢谢,这是一个非常优雅的解决方案,它可以正常工作。你帮了大忙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多