SQL - сокращение запроса - PullRequest
1 голос
/ 01 марта 2012

У меня есть система репутации на моем сайте, похожая на переполнение стека, где участник получает очки за выполнение различных задач. Одной из таких задач является комментирование статей блога.

Я только хочу дать своему пользователю 5 баллов за написание 1 комментария к статье. Если они пишут дополнительные комментарии к той же статье или отвечают на другие комментарии в этой статье, они все равно должны получить только первые 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)

Есть ли способ сократить эти два запроса до одного? Я думал о добавлении запроса на выборку в мой запрос вставки в качестве подзапроса, но, честно говоря, меня это сильно смутило, поскольку я даже не уверен, что смогу использовать INSERT & WHERE вместе, могу ли я?

В любом случае, любые предложения всегда с благодарностью принимаются.

МОЙ ОТВЕТ

Благодаря доброму ответу Майкла, ответ на мой вопрос:

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 Ответ

3 голосов
/ 01 марта 2012

Попробуйте это:

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
)

UPDATE:

@ 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...