#mysql
#mysql
Вопрос:
У меня есть этот запрос, с которым у меня возникли проблемы.
SELECT
f.*
FROM
siv_forms f
WHERE
f.urlname = 'test_form_custom_url'
AND f.active = 1
AND find_in_set(50, f.siteIds)
AND f.endDate > 1404307448
IF (f.max_responses > 0) THEN
AND (SELECT COUNT(fr.id) as count FROM siv_forms_responses fr WHERE formId = f.id) > f.max_responses
END IF
По сути, я хочу, чтобы последнее условие AND было включено только в том случае, f.max_responses
если оно больше 0.
Я мог бы сделать это с помощью нескольких отдельных запросов и PHP, но я пытаюсь уменьшить количество запросов, которые мне приходится выполнять.
Комментарии:
1. Я не могу добавить желаемые результаты, поскольку на данный момент у меня нет никаких реальных данных, но я пытаюсь выполнить запрос (ЕСЛИ max_responses выше 0, возвращайте форму, только если количество ответов ниже max_responses)
2. Давай. Проявите творческий подход.
Ответ №1:
CASE
Выражение должно сделать свое дело. На данный момент я не могу протестировать это, но в простейшей форме:
SELECT
f.*
FROM
siv_forms f
WHERE
f.urlname = 'test_form_custom_url'
AND f.active = 1
AND find_in_set(50, f.siteIds)
AND f.endDate > 1404307448
AND (SELECT COUNT(fr.id) as count
FROM siv_forms_responses fr
WHERE formId = f.id) > CASE
WHEN f.max_responses > 0 THEN f.max_responses
ELSE -1
END CASE
Вы должны быть немного креативны в ELSE
части. Я использовал -1
здесь, но я не уверен, что вы хотите, чтобы это произошло, когда f.max_responses <= 0
. По сути, вы здесь говорите: x
должно быть больше, чем y
if y > 0
, else x
должно быть больше, чем -1
.
Возможно, вы можете обернуть все условие в CASE
оператор. Не уверен, что это сработает (поскольку я не могу протестировать это на данный момент):
AND CASE
WHEN f.max_responses > 0 THEN
(SELECT COUNT(fr.id) as count
FROM siv_forms_responses fr
WHERE formId = f.id) > f.max_responses
ELSE TRUE
END CASE
Комментарии:
1. Спасибо :), я попробую. Я действительно придумал
AND (((SELECT COUNT(fr.id) as count FROM siv_forms_responses fr WHERE formId = f.id) > f.max_responses) || f.max_responses = 0)
, но я не проверил это должным образом, чтобы увидеть, работает ли это.
Ответ №2:
Другой способ мышления…
Вы могли бы в любом случае включить данные из siv_forms_responses и просто не использовать или удалять записи в php, когда это необходимо.
Или, поскольку у вас есть одно или несколько отношений между этими таблицами, создайте ПРЕДСТАВЛЕНИЕ и выполните оператор SELECT для этого представления.
Таким образом, операторы SQL остаются более простыми (понятными) и, возможно, ваш php-код тоже.