Mysql 具有最匹配关系的条目

Mysql 具有最匹配关系的条目,mysql,sql,laravel,eloquent,Mysql,Sql,Laravel,Eloquent,我正试图创建一个小的“推荐”功能的基础上最匹配的标签帖子 我有一个这样的布局: SELECT DISTINCT p.id, p.title, count(*) as cnt FROM posts p INNER JOIN posts_tags pt ON pt.post_id= p.id INNER JOIN tags t ON pt.tag_id = t.id WHERE t.id IN ( SELECT

我正试图创建一个小的“推荐”功能的基础上最匹配的标签帖子

我有一个这样的布局:

 SELECT DISTINCT
    p.id,
    p.title,
    count(*) as cnt
 FROM
    posts p
 INNER JOIN posts_tags pt ON pt.post_id= p.id
 INNER JOIN tags t ON pt.tag_id = t.id
 WHERE
    t.id IN (
        SELECT
            pt.tag_id
        FROM
            posts_tags pt
        WHERE
            pt.post_id = '30213'
    )
 GROUP BY
    t. NAME
 order by count(*) desc
 LIMIT 0, 4
 4  Foo 4881
 4  Foo 2560
 11 Bar 2094
 12 Baz 1998
职位

邮政标签

post_id  | tag_id 
---------+---------
1        | 1
1        | 2
2        | 2
2        | 3
2        | 4
3        | 1
3        | 2
3        | 4
4        | 5
标签

因此,如果我要检索id为1的帖子的推荐,列表应该会显示出来

3(2/2场比赛) 2(1/2场比赛) 4(0/2匹配)

到目前为止,我的查询如下所示:

 SELECT DISTINCT
    p.id,
    p.title,
    count(*) as cnt
 FROM
    posts p
 INNER JOIN posts_tags pt ON pt.post_id= p.id
 INNER JOIN tags t ON pt.tag_id = t.id
 WHERE
    t.id IN (
        SELECT
            pt.tag_id
        FROM
            posts_tags pt
        WHERE
            pt.post_id = '30213'
    )
 GROUP BY
    t. NAME
 order by count(*) desc
 LIMIT 0, 4
 4  Foo 4881
 4  Foo 2560
 11 Bar 2094
 12 Baz 1998
我知道由于计数的原因,DISTINCT不起作用,但我想看看他计算了什么,所以结果如下:

 SELECT DISTINCT
    p.id,
    p.title,
    count(*) as cnt
 FROM
    posts p
 INNER JOIN posts_tags pt ON pt.post_id= p.id
 INNER JOIN tags t ON pt.tag_id = t.id
 WHERE
    t.id IN (
        SELECT
            pt.tag_id
        FROM
            posts_tags pt
        WHERE
            pt.post_id = '30213'
    )
 GROUP BY
    t. NAME
 order by count(*) desc
 LIMIT 0, 4
 4  Foo 4881
 4  Foo 2560
 11 Bar 2094
 12 Baz 1998
发生了什么事?它通常统计标签的出现次数。因此,“Post 1”的第一个关联标记显然是4881关联的,然后提取匹配的第一个条目。。。id最低的那个


我看到了问题,但解决不了

你的
分组依据
毫无意义。您希望通过post而不是标记进行聚合:

这将不会返回
0
。如果这很重要,您需要使用
左连接
而不是
其中。在

此外:

  • SELECT DISTINCT
    几乎从未与
    GROUP BY
    一起使用。很难(但并非不可能)想出它的用例
  • 您不需要
    标记
    表,因此我将其删除
  • 不要在数字周围使用单引号。我猜
    post\u id
    确实是一个数字
  • 修复程序位于
    组中

我记得你总是在sql相关问题上帮助我。你对进一步学习有什么建议吗?