簡體   English   中英

如何從標簽創建臨時表?

[英]How to create temp table from tags?

我有一個product_tableproduct_id其他幾個領域之一。

我創建一個tag_table有2場, tag_idtag_name

標簽可以是“銀”或“ penn狀態”之類的任何東西。

我還將創建一個帶有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) ,在multi_column索引之上(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

  )

您可以在select語句上創建視圖。

(視圖基本上是一個虛擬表,您可以輕松查詢它,但該表中會包含來自復雜語句的數據。請閱讀該手冊,在性能和讀/寫行為方面,它並不是那么簡單。)

但是,您的查詢可能如下所示:

SELECT 
product_id, count(*) as total 
FROM tag_map WHERE tag_id IN (2,4,5) 
AND total = 3 
AND product_id NOT IN (
SELECT product_id, count(*) as total FROM tag_map WHERE tag_id IN (3,6) 
WHERE total = 2 GROUP BY ( product_id )
)
GROUP BY ( product_id )

您也可以加入,但我認為會慢一些。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM