【问题标题】:How can I find items with best matches tags in a desc order by comparing a tags list?如何通过比较标签列表以 desc 顺序找到具有最佳匹配标签的项目?
【发布时间】:2021-09-25 20:55:33
【问题描述】:

我的桌子就像 - items表-

id-----item_id----name----tags--------------------------------------created_at
1------1234------test 1---["tag1", "tag2", "tag3","tag4", "tag5"]---2021-07-13 17:31:08
2------1234------test 1---["tag1", "tag2", "tag3","tag4", "tag5"]---2021-06-13 12:31:34
3------4568------test 2---["tag1", "tag4", "tag5","tag6", "tag7"]---2021-06-13 12:32:05
4------6789------test 3---["tag1", "tag3", "tag5","tag6", "tag7"]---2021-05-13 12:23:34
5------7890------test 4---["tag1", "tag4", "tag5","tag6", "tag7"]---2021-05-13 12:23:34
6------2456------test 5---["tag1", "tag2", "tag5","tag7", "tag8"]---2021-05-13 12:23:34
7------3812------test 9---["tag1", "tag2", "tag3","tag4", "tag9"]---2021-05-13 12:23:34

tags

id-----name
1------tag1
2------tag2
3------tag3
4------tag4
5------tag5
6------tag6
7------tag7
8------tag8
9------tag9

item_tag

id----tag_id----item_id
1-----1---------1
2-----1---------2
3-----1---------3
4-----1---------4
5-----1---------5
6-----1---------6
7-----2---------1
8-----2---------2
9-----2---------6
10----3---------1
11----3---------2
12----3---------4
13----4---------1
14----4---------2
15----4---------3
16----4---------5

如果我想将它们与某个项目进行比较,我如何才能以 desc 顺序找到具有最佳匹配标签的项目!就像我想找到与给定项目的标签相比的前 5 个最匹配的项目 -

id-----item_id----name----tags--------------------------------------created_at
7------3597------test 6---["tag1", "tag2", "tag4","tag7", "tag8"]---2021-07-13 17:31:08

我想要的结果是 -

item_id-------name------matched_tags
2456----------test 5----4
3812----------test 9----3
7890----------test 4----3
4568----------test 2----3
1234----------test 1----3
6789----------test 3----2

我试过了-

SELECT distinct items.item_id, items.name, COUNT(items.item_id) AS tag_count
FROM items
JOIN item_tag
ON item_tag.item_id = items.id
WHERE item_tag.tag_id IN (121,126,2189,796,63,408,47,14,332,3937,27)
GROUP BY items.item_id, items.name
ORDER BY tag_count desc

但问题是我每天都有一些重复的项目(最多项目,不是全部)。所以它会为重复的项目返回更大的计数-

假设我有一个像 -

id-----item_id----name----tags--------------------------------------created_at
4------6789------test 3---["tag1", "tag3", "tag5","tag6", "tag7"]---2021-05-13 12:23:34

3 次。所以它返回 tags_count 6 而不是 2

【问题讨论】:

  • 您尝试的查询是什么,您在哪里遇到问题?
  • 用我迄今为止尝试过的内容编辑了我的问题。

标签: mysql sql database laravel eloquent


【解决方案1】:

如果您想避免重复计数,请使用count(distinct)

SELECT i.item_id, i.name, COUNT(dISTINCT it.tag_id) AS tag_count
FROM items i JOIN
     item_tag it
     ON it.item_id = i.id
WHERE irt.tag_id IN (121,126,2189,796,63,408,47,14,332,3937,27)
GROUP BY i.item_id, i.name
ORDER BY desc;

还要注意,表别名的使用使查询更易于编写和阅读。

【讨论】:

    猜你喜欢
    • 2020-12-14
    • 2011-04-16
    • 2011-04-04
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    相关资源
    最近更新 更多