[英]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
";
(订购DESC
或ASC
,取决于您的最高消费)
但是,这只会考虑“真实”匹配,任何像“ pgp”而不是“ php”的错字都会破坏搜索结果的质量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.