Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql-通过连接表中的搜索标记进行搜索,根据匹配数对结果进行排序,并将大多数匹配项放在顶部-解决方案?_Mysql_Select_Count_Match_Sql Order By - Fatal编程技术网

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                 |