如何从一个MySQL数据库中为一个项目提取两个类别和标签?

我的数据库中有5个表格。
[物品] - 身份证,名称等...
[类别] - 编号,名称
[标签] - ID,名称

2加入表格
[Items_Categories] - item_id,category_id
[Items_Tags] - item_id,tag_id

我只需要知道性能最好的查询(根据需要使用JOINS),从数据库中提取1个或多个项目,并提供item_id = $ id在内的所有信息,包括类别和标签。

到目前为止,我有以下工作,但在25 - 50个查询中,它很慢(有没有人有更好的?):

    SELECT `items`.`name`, `items`.`etc`,
group_concat(DISTINCT categories.name ORDER BY categories.name DESC SEPARATOR ", ") AS category, 
group_concat(DISTINCT tags.name ORDER BY tags.name DESC SEPARATOR ", ") AS tag, 
`items`.`id` AS id 
FROM (`items` AS items, `item_categories` AS categories, `items_to_categories` AS items_cats, `item_tags` AS tags, `items_to_tags` AS items_tags) 
JOIN `item_categories` ON `categories`.`id` = `items_cats`.`category_id` AND items_cats.item_id = $id 
JOIN `item_tags` ON `tags`.`id` = `items_tags`.`tag_id` AND items_tags.item_id = $id WHERE `items`.`id` = $id

问题在于你实际上是在做一个完整的交叉连接(按照你所做的方式列出这些表),而不是按照“按顺序”选择性地加入,并允许查询计划简化连接。 尝试像这样加入,以便只显式连接相应的行。

SELECT 
  `items`.`name`, 
  `items`.`etc`,
  group_concat(DISTINCT `categories`.`name` ORDER BY `categories`.`name` DESC SEPARATOR ", ") AS category, 
  group_concat(DISTINCT `tags`.`name` ORDER BY `tags`.`name` DESC SEPARATOR ", ") AS tag, 
  `items`.`id` AS id 
FROM `items`, 
  LEFT JOIN `item_categories` ON `items`.`id` = `item_categories`.`item_id`
  LEFT JOIN `categories` ON `item_categories`.`category_id` = `categories`.`id`,
  LEFT JOIN `item_tags` ON `items`.`id` = `item_tags`.`item_id`
  LEFT JOIN `tags` ON `item_tags`.`tag_id` = `tags`.`id` 
WHERE `item`.`id` = $id
GROUP BY `item`.`id`

这将产生一个快速查询,并且通过添加适当的索引可以更快速地进行查询。 然而,我的理念是,你应该先查询一个快速查询,然后通过索引快速查询; 不使用索引作为第一种方法。

链接地址: http://www.djcxy.com/p/63799.html

上一篇: How do I pull both categories AND tags from a MySQL Database for an item?

下一篇: How to join two tables together in SQL?