我的网站上有一个声誉系统,类似于Stack Overflow,其中一个成员将获得执行不同任务的积分。其中一项任务是评论博客文章。
我只想给我的用户5分写一条评论文章。如果他们在同一篇文章上写下额外的评论,或回复该文章中的其他评论,他们仍然只能得到前5分。
为了做到这一点,我一直在查询blog_comments表,检查该成员之前是否已经在该文章上发表了评论,如果没有,在另一个查询中,我会将5个点添加到members_reputation表中。我的例子如下所示:
SELECT COUNT(*) AS duplicates_found FROM blog_comments
WHERE member_id = 12722 AND article_id = 30202
// in my server-side language I would have
// if duplicates_found = 0 then
INSERT INTO members_reputation (member_id, awarded_for, awarded_when, awarded_what)
VALUES (12722, 'Posted a comment', Now(), 5)
有没有办法缩短这两个查询来制作一个查询?我正在考虑将select查询添加到我的插入查询作为子查询,但我会说实话,它让我很困惑,因为我甚至不确定我可以使用INSERT&在哪里,我可以吗?
无论如何,总是感激地收到任何建议。
MY ANSWER
感谢迈克尔的回答,我的问题的答案是:
INSERT INTO members_reputation (member_id, awarded_for, awarded_when, awarded_what)
SELECT 12722, 'Posted a comment', Now(), 5 FROM DUAL
WHERE NOT EXISTS
(
SELECT * FROM blog_comments
WHERE member_id = 12722 AND article_id = 30202
)
答案 0 :(得分:3)
试试这个:
INSERT INTO members_reputation (member_id, awarded_for, awarded_when, awarded_what)
select 12722, 'Posted a comment', Now(), 5
where not exists
(
select * FROM blog_comments
WHERE member_id = 12722 AND article_id = 30202
)
<强>更新强>
@MartinG我的盒子里没有MySQL。我试过http://sqlzoo.net但是,似乎MySQL就像Oracle,没有源表的SELECT需要一个虚拟表,你可以使用DUAL表来代替虚拟表
select 'hello' as "No, it is right!" from dual where
exists( SELECT * FROM bbc
WHERE name = 'China')