2012-08-07 33 views
0

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

所以我试图做的是写一个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所以也许你的某个人可以帮助我!

谢谢!

P.S .:我已经看过线程Searching concatenated field但这不会做,因为我真的需要搜索整个名称,而不仅仅是它的每个部分。

+0

确定你有一个语法错误的原因是因为你正在尝试使用一个不属于的表别名 - 删除最后一个'name_str'和*语法*将是确定的,但查询仍然不会工作。你需要做的是使用明确的'JOIN's。您的字段列表不明确,您没有将'gatheringsitecoordinates'或派生表与其他表中的列匹配,将其余结果与其他结果绑定。你不需要执行派生表查询两次,你只需要'加入'它并使用'LIKE'的一个字段。你能解释一下你的表格模式吗? – DaveRandom 2012-08-07 10:18:20

回答

0

您需要添加一个WHERE条款 - 像这样...

... epithet) FROM name) WHERE name_str LIKE ... 
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。

+0

表模式如下:观察,名称,Gatheringsitecoordinates 观察到名称(N:1) 观察到Gatheringsitecoordinates(N:1) 表有如下相关列内: 观察:observationid,fkgatheringsite ,fkname 名称:填充NameID,genusormonomial,firstepithet,等级,hybridflag,intraspecificepithet,fullnamestring Gatheringsitecoordinates:sitecoodinateid,latitudedecimal,longitudedecimal genusormonomial:大麻,firstepithet:水稻,等级:亚种,hybridflag:(NULL),intraspecificepithet:籼稻 - >大麻sativa subsp。水稻 – 2012-08-10 08:34:46

+0

我试图像你说的那样做,但它返回一个错误。错误:'where子句'中的未知列'sed' 或错误:您的SQL语法中有错误;根据我在搜索字段中输入的内容,检查与您的MySQL服务器版本相对应的手册,以便在第2行 的“%”附近使用正确的语法。 ON语句在FROM部分中做什么? – 2012-08-10 08:45:38

+0

“on”语句给出将两个表连接在一起的条件。它是连接的标准语法,应该在任何数据库的文档中进行解释。 – 2012-08-10 13:09:04