如何从一个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?