2

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

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

我确定我遗漏了一些小东西,但我将不胜感激可以提供的任何帮助。我可能一开始就错了。

4

1 回答 1

6

试试这个:

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);

因此,如果您通过 a $indicator = NULL,那么第一个条件AND ($indicator IS NULL OR i.indicator LIKE '%$indicator%')将被忽略,因为它将解析为True,而第二个条件也是如此。

我已经删除了其他条件并用sWhere替换它们,并且为了使查询正常工作,以防您传递两个变量和每个变量的值,在这种情况下,它将返回所有结果,因为它始终为真。JOINWHERE 1 = 1$indicator$indtypeidNULL1 = 1

于 2012-04-17T14:56:33.687 回答