0

コレクション データベースで植物名を検索するプログラムをPHPで作成しています。植物の学名 (Rumex acetosa や Medicago x varia など) を入力して、その名前のすべてのエントリを検索できるはずです。植物の名前は細分化されているため、すべての名前は 2 ~ 5 つの部分で構成されています。各パーツを個別に検索したくありませんが、それらをすべて 1 つの名前に追加する必要があります。

だから私がやろうとしたことは、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 構文にエラーがあります。2行目付近で使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してくださいname_str LIKE 'rum%'

最終的にどのように表示されるかを理解するには、http://bgbm3.bgbm.fu-berlin.de/iopi/gpc/query.aspを参照してください。

私は完全な Sql 初心者なので、誰かが私を助けてくれるかもしれません!

ありがとう!

PS:私はすでにスレッドSearching concatenated fieldを見てきましたが、これはできません。名前の各部分だけでなく、名前全体を検索する必要があるからです。

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.sitecoordinateidの問題です。上記では、それが観察の一部であると仮定しました。別のテーブルの場合は、おそらく次のようなものが必要です。

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 に答える