我有一个 product_table
,其中包含 product_id
以及其他几个字段。
我正在创建一个包含 2 个字段的 tag_table
:tag_id
和 tag_name
。
标签可以是“银牌”或“宾夕法尼亚州立大学”等任何内容。
我还创建了一个包含 product_id
和 tag_id
的 product_tag_map
表,以便将产品映射到任意数量的标签。
如果我想创建一个包含所有标记为“银”、“项链”、“钻石”的产品的类别。但也要排除任何标记为“初始”、“旅程”的产品
(显然我会使用 tag_id 而不是 tag_name,因此带有标签 [2,4,5] 的产品没有标签 [3,6])
如何创建临时产品表并用匹配的产品填充它?
更新
这是我的product_tag_map 表:
CREATE TABLE `product_tag_map` (
`product_tag_map_id` int(11) NOT NULL auto_increment,
`tag_id` int(11) NOT NULL,
`product_id` int(11) NOT NULL,
PRIMARY KEY (`product_tag_map_id`),
UNIQUE KEY `tag_id` (`tag_id`,`product_id`),
KEY `tag_id_2` (`tag_id`)
) ENGINE=MyISAM AUTO_INCREMENT=7897 DEFAULT CHARSET=utf8
注意:我没有将 product_tag_map_id
用于任何用途。我只是习惯给每个表一个主键,就像这样。所以如果我应该删除它那很好。
最佳答案
问题是,您需要临时表来做什么?为什么不直接查询呢?
SELECT
p.product_id,
p.product_name
FROM
product_table p
WHERE
EXISTS (
SELECT 1
FROM product_tag_map
WHERE product_id = p.product_id AND tag_id IN (2,4,5)
)
AND NOT EXISTS (
SELECT 1
FROM product_tag_map
WHERE product_id = p.product_id AND tag_id IN (3,6)
)
创建适当的索引(一个基于 (product_tag_map.product_id, Product_tag_map.tag_id)
的多列索引和一个基于 (product_tag_map.tag_id)
的单独索引,此外“正常”PK/FK 指数),这应该很快。
编辑:以上的可缓存(就查询计划而言)和更动态的变体将是:
创建一个 user_searches
表 (search_session_id, tag_id, include)
,其中在 (search_session_id, include)
上有一个多列索引,在 (search_session_id, include)
上有一个单独的索引tag_id
。然后在用户选择条件时填写它:
search_session_id tag_id include
...
4711 2 1
4711 4 1
4711 5 1
4711 3 0
4711 6 0
...
像这样查询:
SELECT
p.product_id,
p.product_name
FROM
product_table p
WHERE
EXISTS (
SELECT 1
FROM product_tag_map m INNER JOIN user_searches s ON s.tag_id = m.tag_id
WHERE m.product_id = p.product_id
AND s.search_session_id = 4711 /* this should be a parameter */
AND s.include = 1
)
AND NOT EXISTS (
SELECT 1
FROM product_tag_map m INNER JOIN user_searches s ON s.tag_id = m.tag_id
WHERE m.product_id = p.product_id
AND s.search_session_id = 4711 /* this should be a parameter */
AND s.include = 0
)
关于php - 如何从标签创建临时表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3788519/