2015-01-12 36 views
0

Fiddle Example檢查組合(集團通過時間戳)在MySQL

存在我有一個頁面,讓人們比較從數據庫項目。每個比較的項目數量不固定。我使用兩列表來存儲它們的比較記錄和時間戳,以將它們組合在一起。

假設我有product_id 304308306,我該如何檢查它們是否存在於數據庫中作爲同一組?我不知道如何檢查多個product_ids的組合,我正在尋找這樣的事情:

輸出:

product_id name 
306|308|304 D|E|C 

這裏的查詢:

SELECT product_id,name 
FROM (
    SELECT 
    GROUP_CONCAT(c.product_id SEPARATOR "|") AS product_id, 
    GROUP_CONCAT(p.name SEPARATOR "|") AS name 
    FROM compare c 
    INNER JOIN product p ON p.product_id = c.product_id 
    GROUP BY c.timestamp 
    ORDER BY c.timestamp 
    /* How to do a where clause here? WHERE p.product_id = 306 AND p.product_id = 308 AND p.product_id = 304 */ 
)e 
GROUP BY product_id 


CREATE TABLE compare 
    (`product_id` int,`timestamp` timestamp) 
; 

INSERT INTO compare 
    (`product_id`,`timestamp`) 
VALUES 
    (300,'2015-01-12 19:04:13'), 
    (302,'2015-01-12 19:04:13'), 
    (304,'2015-01-12 19:06:24'), 
    (306,'2015-01-12 19:06:24'), 
    (308,'2015-01-12 19:06:24'), 
    (310,'2015-01-12 19:08:40'), 
    (312,'2015-01-12 19:08:40'), 
    (314,'2015-01-12 19:08:40'), 
    (316,'2015-01-12 19:08:40'), 
    (302,'2015-01-12 19:10:50'), 
    (316,'2015-01-12 19:10:50') 

; 

CREATE TABLE product 
    (`product_id` int,`name` varchar(30)) 
; 

INSERT INTO product 
    (`product_id`,`name`) 
VALUES 
    (300,'A'), 
    (302,'B'), 
    (304,'C'), 
    (306,'D'), 
    (308,'E'), 
    (310,'F'), 
    (312,'G'), 
    (314,'H'), 
    (316,'I') 

; 
+1

WHERE n IN(x,y,z)GROUP BY a HAVING COUNT(*)= 3 – Strawberry

+1

您不應該使用時間戳作爲唯一ID,因爲無法保證它們的唯一性。 –

回答

1

如果我有你的意圖是,你想維護一個比較列表,並能夠回答一個問題,如果發生了某種比較,並可能保留這個列表重複數據刪除。

您的方法不起作用。

您需要的是有一種有效的方法來將您的product_ids設置爲某種標識符。這裏是可能的方法之一:

CREATE TABLE comparison (
    id int not null auto_increment, 
    created_at timestamp default current_timestamp, 
    hash varchar(16), -- or some other type depending the hash function of your choice 
    primary key (id), 
    key (hash) 
); 

CREATE TABLE comparison item (
    comparison_id int not null, 
    product_id int not null, 
    primary key (comparison_id, product_id) 
); 

當創建一個新的比較(或者檢查是否已經存在),你算算設置你的product_ids的散列函數,說你你product_ids排序,將它們連接起來,得到的MD5結果並以十六進制表示形式存儲字符串的一半(它更短且仍然足夠)。

如果您正在檢查已存儲的比較,則首先檢查是否存在具有給定散列的記錄。

如果是,那麼您可以使用相應的comparison_id獲取第二個表中的所有行,以確保您沒有太幸運遇到碰撞。

如果不是這樣,那意味着您從未遇到過此組。

使用此結構,您仍可以在創建比較時存儲時間戳,並檢查是否曾使用過某個product_id(爲此,您需要在第二個表中額外添加key(product_id))。