mysql-通过连接表中的搜索标记进行搜索,根据匹配数对结果进行排序,并将大多数匹配项放在顶部-解决方案?
我有一个包含三个表的关系数据库:mysql-通过连接表中的搜索标记进行搜索,根据匹配数对结果进行排序,并将大多数匹配项放在顶部-解决方案?,mysql,select,count,match,sql-order-by,Mysql,Select,Count,Match,Sql Order By,我有一个包含三个表的关系数据库: hieroglyphs hieroglyph_has_search_tag search_tags ------------------- --------------------------------- ------------------- | id | hieroglyph | | hieroglyph_id | search_tag_id | | id | search_tag | -----+-
hieroglyphs hieroglyph_has_search_tag search_tags
------------------- --------------------------------- -------------------
| id | hieroglyph | | hieroglyph_id | search_tag_id | | id | search_tag |
-----+------------- --------------------------------- -------------------
我想创建一个查询,允许我搜索带有一个或多个搜索标记的象形文字,按匹配数对结果进行排序和分组(匹配最多的象形文字应排在列表的第一位),搜索标记数较少的象形文字将占据较低的行。
这是一个it结果外观示例(输入的搜索标签:男士,坐着,举起手臂
):
在那之后要得到这样的东西:
+----+---+
| 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()
、groupby
和orderby
,但我没有找到如何实现这些方法的解决方案,以使我的MySQL查询能够按我所希望的方式工作。非常感谢您的帮助。您可以按象形文字分组
并使用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
请参阅。结果:
这是一个完美的解决方案。它就像一个符咒。非常感谢。你知道我如何更进一步,在第3列中为特定行连接搜索标记吗?对于
A1
,它将是man,siting,arms up
?谢谢你,这是一个非常优雅的解决方案,它可以正常工作。你帮了大忙。
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 |