我有一个包含三个表的关系数据库:
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 查询按我想要的方式工作的解决方案。我将不胜感激任何帮助。
您可以使用 COUNT((group by hieroglyph
和聚合,然后按 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 |