Возможно ли что-то подобное, используя только MySQL?

#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-код тоже.