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