我有这个问题,我遇到了麻烦。
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来做到这一点,但我试图减少我必须做的查询量。
答案 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代码。