mysql - 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 BY
和ORDER BY
,但是我没有找到关于如何实现这些以使我的 MySQL 查询按我想要的方式工作的解决方案。我将不胜感激任何帮助。
解决方案
您可以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 |
推荐阅读
- javascript - 如果行的所有元素都不是值(NaN,null,未定义),如何删除数组数组中的行?
- javascript - Redux 连接的反应应用程序 - 在我的副作用完成之前我如何不渲染它?
- javascript - 递归修补值切割一些数据
- opencart - 如何在 Opencart 的购物车中硬编码一件商品?
- linux - 用户空间线程实现中的 sleep()
- c++ - “不能增加结束列表迭代器”运行时错误 (Visual C++)
- azure-data-lake - dataFactory V2 - 通配符
- google-apps-script - 尝试复制可变长度列表
- cloudflare - 为什么我必须在 GTmetrix 上测试我的站点两次才能看到 cloudflare 的速度优势?
- c# - 在 SpeechSynthesizer 中改变声音