使用MySql是否可以这样?

时间:2014-07-02 13:32:16

标签: 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

基本上我只希望在f.max_responses大于0时包含最后一个AND条件。

我可以通过几个单独的查询和PHP来做到这一点,但我试图减少我必须做的查询量。

2 个答案:

答案 0 :(得分:2)

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 y > 0,否则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 :(得分:0)

另一种思维方式......
你可以包括来自siv_forms_responses的数据,只是在需要时不要使用或删除php中的记录。

或者因为这些表之间有一个或多个关系,所以在该VIEW上创建一个VIEW并创建一个SELECT语句。

这样,SQL语句仍然更简单(更清晰),也许你也是php代码。