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相关问题上帮助我。你对进一步学习有什么建议吗?