MySQL 查询搜索带有父项标签的项

标签 mysql

所以我遵循了他们在这里所做的事情: MySQL query to search for items with certain tags

但是还有一个额外的要求,假设我们有以下数据:

items:
id | item    | parent_id
------------------------
1  | banana  |  0
2  | orange  |  1
3  | tomato  |  0


items_tags:

id | item_id | tag_id
---------------------
1  | 1       | 1
2  | 1       | 2
3  | 2       | 3   
4  | 3       | 4

tags:

id | tag
--------------
1  | yellow
2  | fruit
3  | orange
4  | red

我希望搜索标有 id 2(水果)的项目,并希望返回项目香蕉和橙子。首先,这是存储信息的最佳方式,如果是的话,我可以运行以取回香蕉及其子橙子的最有效查询是什么。

谢谢

最佳答案

存储数据的更好方法可能是从 item_tags 表中删除冗余列(规范化):

items:
id | item    | parent_id
------------------------
1  | banana  |  0
2  | orange  |  1
3  | tomato  |  0

items_tags:

item_id | tag_id
------------------
1       | 1
1       | 2   
2       | 3   
3       | 4

tags:

id | tag
--------------
1  | yellow
2  | fruit
3  | orange
4  | red

那么您获取水果的查询(仅包含与“fruit”标签直接相关的项目)可能是:

select items.id, items.item from items 
inner join item_tags on (items.id=item_id) 
inner join tags on (tags.id=tag_id)
where tag = 'fruit'

还包括由父级连接的项目:

select items.id, items.item from items 
inner join items parents on (parents.id=items.parent_id)
inner join item_tags on (item_id=items.id OR item_id=parents.id ) 
inner join tags on (tags.id=tag_id)
where tag = 'fruit'

关于MySQL 查询搜索带有父项标签的项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44812088/

相关文章:

MySQL Fulltext 分隔数字和字母?

mysql - Spring Boot 和 MySQL 找不到数据库

c++ - 使用 C++ 代码限制 MySQL 查询时间

php - 分页器类

mysql - SQL查询,我做错了什么?

mysql - 我怎样才能更好地优化这个查询?

php - 定时器 mysql php 检查

javascript - 从数据库中提取数据并显示在排行榜中

MySQL 如何编写 SQL 来查找任何 15 分钟窗口中的过多事务?

php - MySQL查询-日期字段的周年纪念日