2017-04-10 112 views
0

我們有2臺這樣的:檢查MySQL的,如果行不存在,然後插入(沒有唯一鍵)

1:帖子

ID Title Hits 
1 Title 1 4 
2 Title 2 7 
3 Title 3 19 
4 Title 4 8 

2:點擊

ID PostID  IP 
1  2  5.9.9.45 
2  3  5.9.9.45 
3  2  72.5.4.9 
4  4  5.9.9.45 

現在我們需要一個查詢來檢查'hits'表中是否存在具有特定PostID和IP地址的行,插入一個新行並增加post.Hits一個單位(這是一個計數器)。

我們測試此查詢:

INSERT INTO table (field) VALUES (value) ON DUPLICATE KEY UPDATE field=value 

但正如你看到的,IP和帖子ID不能是唯一的關鍵。他們可以爲不同的用戶複製。 如果沒有PostID + IP,有什麼方法可以在一個查詢中插入和更新嗎?

回答

0

讓每個崗位唯一的IP的你不喜歡@戈登 - linoff說:

create unique index unq_hits_postid_ip on hits(postid, ip); 

然後你可以用下面的語法「忽略」插入:

insert into hits (postid, ip) values (2,'5.9.9.45') on duplicate key update id=id; 

然後,您可以使用觸發器來確保在插入ip時更新匹配列:

DELIMITER/

CREATE TRIGGER trg_ai_hits AFTER INSERT ON hits 
    FOR EACH ROW 
BEGIN 
    UPDATE posts SET hits = hits + 1 WHERE id = NEW.postid; 
END; 
/

DELIMITER ; 

雖然我不會我自己設計這種方式,我不會跟蹤表中的點擊次數!取而代之,您可以在運行時使用SQL輕鬆完成命中。

要指望一個特定職位的命中數(您想索引的posts.title這裏):

select 
count(1) as hits 
from posts p 
join hits h on p.id = h.postid 
where p.title = 'Title 2'; 

要獲得命中了幾個帖子,你可以使用GROUP BY子句:

select 
p.title, 
count(1) as hits 
from posts p 
join hits h on p.id = h.postid 
where p.title in ('Title 2', 'Title 3') 
group by p.title 
order by hits desc; 

此外,我認爲你多次存儲相同的IP是很好的。根據您當前的設計,您可以檢查IP號碼訪問您的網站的次數:

select 
ip, 
count(postid) access_number 
from hits 
group by ip 
order by access_number desc; 
+0

挑戰是這樣的: 1-當用戶打開帖子頁面時,增加該帖子的打擊次數。2-如果該用戶打開另一個帖子,其命中增加。 3如果該用戶第二次打開帖子,不要這麼做! –

+0

然後你就像@ gordon-linoff所說的那樣創建一個唯一索引。 –

+0

用插入示例更新了我的答案。 –

0

你只需要在列的唯一索引/約束,而不是一個:

create unique index unq_hits_postid_ip on hits(postid, ip); 

然後你可以使用on duplicate key update

但是,這將工作在一個表。在增加一個計數器另一個表是一個奇怪的設計。爲什麼不只是在hits有櫃檯?如果你必須在另一個表中增加,那麼你需要一個觸發器。

+0

不!我們希望如果重複發生,什麼都不做!但是,如果它是新行,請插入它,然後更新另一個表列。 –

相關問題