如何从项目的MySQL数据库中提取类别和标签?

时间:2012-08-24 23:59:12

标签: php mysql sql codeigniter join

我的数据库中有5个表。
[Items] - id,name等...
[类别] - id,名称
[标签] - id,名称

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

我只需要知道性能最佳的查询(根据需要使用JOINS)从DB中提取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

1 个答案:

答案 0 :(得分:2)

问题在于,您实际上是首先进行完全交叉连接(通过按照您的方式列出表),而不是选择性地“按顺序”加入,并允许查询计划简化连接。尝试像这样加入以显式连接适当的行。

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`

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