【问题标题】:multiple tag search query not working多标签搜索查询不起作用
【发布时间】:2023-04-09 14:01:01
【问题描述】:

我有一个查询来通过多个标签搜索数据,我从这个问题Multiple tags search query 中得到了这个想法。我有 3 张桌子,例如书籍(id,title....)。标签(id,名称),books_tag(id,book_id,tag_id)。所以我使用我的查询按标签选择书籍,但没有给出任何结果。

图书桌

id : title
 1 : maths
 2 : science
 3 : HP

标签表

id : name
 1 : a
 2 : b
 3 : c

Book_tag 表

id : book_id : tag_id
 1 :    1    :   2
 2 :    1    :   3 
 3 :    2    :   1
 4 :    3    :   1
 5 :    3    :   2

所以如果我搜索 book 标签 c,结果应该是 book_id 1(数学)或搜索 c 和 a,结果应该是 book_id 1,2,3(数学,科学,HP)

这是我的查询

SELECT books_tag.book_id, books_pre.title
FROM books_tag
JOIN books_pre ON books_tag.book_id = books_pre.id
JOIN tags ON books_tag.tag_id = tags.id
WHERE tags.name IN ('a', 'd')
GROUP BY books_tag.book_id
HAVING COUNT(books_tag.tag_id) = 2

【问题讨论】:

  • 如果不查看您的数据就很难说什么,请在您的问题中包含示例数据、表格定义和预期输出
  • @MKhalidJunaid 我已经编辑了我的问题

标签: mysql tags


【解决方案1】:

你应该使用 count(distinct books_tag.tag_id)

SELECT books_tag.book_id, books_pre.title
FROM books_tag
JOIN books_pre ON books_tag.book_id = books_pre.id
JOIN tags ON books_tag.tag_id = tags.id
WHERE tags.name IN ('a', 'd')
GROUP BY books_tag.book_id
HAVING COUNT(distinct books_tag.tag_id) = 2

【讨论】:

  • 我用过但没有给出任何结果
  • 更新您的问题添加适当的数据样本和预期结果
【解决方案2】:

您正在尝试的查询是针对AND 标准,例如获取那些具有标签 a AND 标签 d 的书籍,根据您的问题,您不需要该标准,只需删除 group by 和 having 子句,您将很好

SELECT DISTINCT b.*
FROM books_pre b
JOIN books_tag bt ON bt.book_id = b.id
JOIN tags t ON bt.tag_id = t.id
WHERE t.name IN ('a', 'b')

Demo

【讨论】:

  • 但是如果按a搜索,b不应该是重复的,
  • 你能解释一下为什么你在表名后面加一个字母,这个b.*是什么意思,我是mysql的新手,谢谢你的回答,跨度>
  • @Looper 它只是用于查询的表的别名(短名称),就像你也可以写成书一样。*但保持它更短我使用别名,当你有相同的列时,别名很好在 2 个表中命名,就像您可以使用 alias.column 来识别每个表一样
【解决方案3】:

试试这个简短的查询:

样本数据:

create table Books(id int, title varchar(10));
insert into Books values
(1, 'maths'),
(2, 'science'),
(3, 'HP');
create table Tag(id int, name char(1));
insert into Tag values                            
(1, 'a'),
(2, 'b'),
(3, 'c');
create table Book_tag(id int, book_id int, tag_id int);
insert into Book_tag values
(1, 1, 2),
(2, 1, 3),
(3, 2, 1),
(4, 3, 1),
(5, 3, 2);

T-SQL:

select distinct book_id from Book_tag bt
where exists(select 1 from Tag
             where id = bt.tag_id
                   and name in ('c', 'a'));

name in (...) 部分,您指定要搜索的标签。

【讨论】:

    猜你喜欢
    • 2012-02-04
    • 2014-04-05
    • 1970-01-01
    • 2016-09-10
    • 2011-07-14
    • 1970-01-01
    • 2017-08-09
    • 2020-01-08
    • 1970-01-01
    相关资源
    最近更新 更多