允许MySQL查询的可选参数

时间:2012-04-17 14:48:23

标签: mysql sql

我有一个搜索页面,其中包含多个用于创建精确搜索的字段。每个字段都是可选的。我正在尝试开始制作我的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;

每当我提供indicatorindtypeid时,搜索就可以了。但是,当我将indtypeid字段留空,并将变量设置为*(作为其默认值)时,查询将不返回任何结果。我已尝试手动播放查询,但似乎不喜欢*%符号。基本上,如果只指定了一个指标而且没有指定indtypeid,我想返回所有indtypeids的所有指标。

我确定我错过了一些小事,但我很感激可以提供的任何帮助。首先,我可能会把这一切都搞错了。

1 个答案:

答案 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始终为真。