0

我正在用PHP编写一个程序来搜索集合数据库中的植物名称。您应该能够输入科学植物名称(例如 Rumex acetosa 或 Medicago x varia)以查找该名称的所有条目。植物名称是原子化的,所以每个名称都由两到五个部分组成。我不想单独搜索每个部分,但我需要将它们全部添加到一个名称。

所以我试图做的是写一个SELECT CONCAT子句。

$sql = "
  SELECT observationid, fullnamestring, latitudedecimal, longitudedecimal
  FROM  observation, (
    SELECT CONCAT (genusormonomial, firstepithet, rank, hybridflag, intraspecificepithet)
    FROM name
  ) name_str, name, gatheringsitecoordinates 
  WHERE name.nameid = observation.fkname
    AND gatheringsitecoordinates.sitecoordinateid = observation.fkgatheringsite
    AND (
      SELECT CONCAT (genusormonomial, firstepithet, rank, hybridflag, intraspecificepithet)
      FROM name
    ) name_str LIKE '" . mysql_real_escape_string($sucharray[0]) . "'
";

不幸的是,它根本无法以这种方式工作,因为他抱怨我的查询语法。

错误:您的 SQL 语法有错误;检查与您的MySQL 服务器name_str LIKE 'rum%'版本相对应的手册,以在第 2 行附近使用正确的语法

为了让您了解它到底应该是什么样子,请浏览http://bgbm3.bgbm.fu-berlin.de/iopi/gpc/query.asp

我是一个完全的 Sql-newb,所以也许你们中的某个人可以帮助我!

谢谢!

PS:我已经查看了搜索连接字段的线程,但这不会,因为我真的需要搜索整个名称,而不仅仅是它的每个部分。

4

2 回答 2

0

您的查询包含没有命名列的子查询。我最接近的猜测是你想要这样的东西:

SELECT observationid, fullnamestring, latitudedecimal, longitudedecimal
FROM  observation o join
      (SELECT CONCAT(genusormonomial, firstepithet, rank, hybridflag, intraspecificepithet) as name_str,
              name.*
       FROM name
      ) n
      on o.nameid = n.nameid
WHERE o.sitecoordinateid = o.fkgatheringsite AND
      namestr like <'" . mysql_real_escape_string($sucharray[0]) . "'>

然而,gatheringsitecoordinates.sitecoordinateid 存在问题,因为没有名为gatheringsitecoordinates 的表。以上,我认为这是观察的一部分。如果它是一个单独的表,那么您可能想要这样的东西:

SELECT observationid, fullnamestring, latitudedecimal, longitudedecimal
FROM  observation o join
      (SELECT CONCAT(genusormonomial, firstepithet, rank, hybridflag, intraspecificepithet) as name_str,
              name.*
       FROM name
      ) n
      on o.nameid = n.nameid join
      gatheringsitecoordinates gsc
      on o.sitecoordinateid = o.fkgatheringsite 
WHERE namestr like <'" . mysql_real_escape_string($sucharray[0]) . "'>

此外,我已将其表示为没有字符串表示法的常规 sql。

于 2012-08-07T19:24:34.307 回答
0

您需要添加一个WHERE子句 - 像这样......

... epithet ) FROM name ) WHERE name_str LIKE ...
于 2012-08-07T10:11:10.950 回答