繁体   English   中英

按IN子句中具有更多匹配值的行排序

[英]Ordering by the row with more match value inside IN clause

我这里有这两张桌子

         posts                               tags
[   id         title    ]          [   pid          tag   ]
[   1            X      ]          [    1            php  ]
[   2            Y      ]          [    1            pdo  ]
[   3            Z      ]          [    2            php  ]
                                   [    2            ajax ]
                                   [    3            pdo  ]

我在这两个表上都应用此查询

$query = "
SELECT a.title FROM posts a
INNER JOIN tags b ON a.id = b.pid
WHERE b.tag IN ($tags)
";

如果现在

$tags = [php, pdo];

我希望得到带有$tags值更匹配的行,因此顺序为X->Y->Z

而如果

$tags = [php, pdo, ajax]

我也希望得到X->Y->Z ,但是在两个查询中的顺序根本不一样,它更像是按名称或标签字母排序的,我该如何按匹配度最高的顺序排序行,并且如果可能的话,所有行都只有匹配值。

如果仅是标签的出现,则可以按计数进行分组和排序。

有点像(未经测试)

$query = "
SELECT a.title, GROUP_CONCAT(b.tag) as tags, count(b.tag) AS relevance FROM posts a
INNER JOIN tags b ON a.id = b.pid
WHERE b.tag IN ($tags)
GROUP BY a.id
ORDER BY count(b.tag) DESC
";

(订购DESCASC ,取决于您的最高消费)

但是,这只会考虑“真实”匹配,任何像“ pgp”而不是“ php”的错字都会破坏搜索结果的质量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM