首页 > 解决方案 > mysql - 通过连接表中的搜索标签搜索,按匹配数对结果进行排序并将大多数匹配放在顶部 - 解决方案?

问题描述

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

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 查询按我想要的方式工作的解决方案。我将不胜感激任何帮助。

标签: mysqlselectcountmatchsql-order-by

解决方案


您可以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

请参阅演示
结果:

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

推荐阅读