我有一个搜索页面,其中包含多个用于创建精确搜索的字段。每个字段都是可选的。我正在尝试开始制作我的SQL查询,以便在适当的变量下它可以工作,但我遇到了麻烦。
这是我目前的SQL查询:
SELECT
indicator.indid,
indicator.indicator,
indtype.indtype,
provider.provider,
report.report,
actor.actor
FROM
actor,
indicator,
indtype,
report,
provider
WHERE
indicator.indtypeid = indtype.indtypeid
AND indicator.actorid = actor.actorid
AND indicator.reportid = report.reportid
AND report.providerid = provider.providerid
AND indicator.indicator LIKE '%$indicator%'
AND indicator.indtypeid = $indtypeid;
每当我提供indicator
和indtypeid
时,搜索就可以了。但是,当我将indtypeid
字段留空,并将变量设置为*
(作为其默认值)时,查询将不返回任何结果。我已尝试手动播放查询,但似乎不喜欢*
或%
符号。基本上,如果只指定了一个指标而且没有指定indtypeid
,我想返回所有indtypeids
的所有指标。
我确定我错过了一些小事,但我很感激可以提供的任何帮助。首先,我可能会把这一切都搞错了。
答案 0 :(得分:5)
请改为尝试:
SELECT i.indid, i.indicator, it.indtype,
p.provider, r.report, a.actor
FROM actor a
INNER JOIN indicator i ON a.actorid = i.actorid
INNER JOIN indtype it ON i.indtypeid = it.indtypeid
INNER JOIN report r ON i.reportid = r.reportid
INNER JOIN provider p ON r.providerid = p.providerid
WHERE 1 = 1
AND ($indicator IS NULL OR i.indicator LIKE '%$indicator%')
AND ($indtypeid IS NULL OR i.indtypeid = $indtypeid);
因此,如果您传递$indicator = NULL
,则第一个条件AND ($indicator IS NULL OR i.indicator LIKE '%$indicator%')
将被忽略,因为它将解析为True
,而第二个条件则相同。
我已删除其他Where
条件并将其替换为JOIN
s,并替换WHERE 1 = 1
以使查询正常工作,以防您传递两个变量$indicator
和$indtypeid
每个NULL
的值,在这种情况下,它将返回所有结果,因为1 = 1
始终为真。