SQL - 缩短查询

时间:2012-03-01 03:47:31

标签: mysql sql

我的网站上有一个声誉系统,类似于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
)

1 个答案:

答案 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')