php - 如何从标签创建临时表?

标签 php mysql sql

我有一个 product_table,其中包含 product_id 以及其他几个字段。

我正在创建一个包含 2 个字段的 tag_table:tag_idtag_name

标签可以是“银牌”或“宾夕法尼亚州立大学”等任何内容。

我还创建了一个包含 product_idtag_idproduct_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/

相关文章:

sql - 查找二进制重复记录 SQL Server 2008(数据类型图像)

php - 禁用 iframe 的基本身份验证

用于动态显示来自mysql的10条记录的PHP代码

javascript - Node js mysql 语法错误

mysql - 数据仓库 - 如何使用 R 和/或 SQL 创建与所有维度相交的事实表

mysql - SQL 查询,从具有不同 ID 的列中检索多个值

php - while 和 foreach 正确的 php

php - Isset 获取页面与 php 的正确用法

MySQL查询连接每行中的所有值基于共同的相同ID匹配

sql - 在 TOAD 7 中格式化 sql 查询。