2017-12-17 12 views
0

私は、とりわけ、いくつかの場所の住所を指定するフィールドを含むテーブルを持っています。私は、指定された検索語と一致するときに、そのテーブルからストリート名の一部だけを返す方法を見つけようとしています。MySQL:アドレステーブルから一意の通り名のリストを選択する必要があります

は、これまでのところ私はこれを持っている:それは私があるしたいALL家#、を含む全住所を返すの不要な副作用を持っていることはもちろん、除いて、大丈夫ん

SELECT `street` FROM `addresses` 
WHERE (`street` LIKE '%searchTerm%') 
GROUP BY `street` 
ORDER BY LOCATE('searchTerm',`street`) 
LIMIT 10; 

通り自体の名前。しかし、どのように先頭の数字、ダッシュ、または#記号を取り除き、クエリーからストリート名を収集するかについては、私は迷っていますか?

これを行う方法はありますか?または、データを取得した後に結果をコード(PHP)で管理するだけですか?

ありがとうございます!

+0

データの種類によって異なります。通りの名前にデータベース全体で1つの単語しか含まれていない場合は、その単語だけを取り出すことができます。しかし、それが複数の言葉なら何ですか?とにかく、関数呼び出しやデータ操作がクエリ時間に余分なオーバーヘッドを持つため、問題のこの部分にmysqlを使用しないでください。ストリート名を個別に索引付けして選択することができます。弾力的な検索のために行く方が良い。 – DecoderReloaded

+0

データは、一般的な形式の要素を持つ単一のvarcharフィールドです。 "[[### - ] ####] Here Here [Street | Road | Crescent | Lane | Parkway | etc] 。明らかに通りの名前は複数の単語になる可能性があります。明らかな特徴は、最初の部分には数字だけが含まれている可能性があり、数字記号やダッシュ/ハイフンの後に空白が続くことです。 –

+2

返信したいのですか?これは、最初のスペースと2番目のスペースの間にある単語を与えるでしょう。 '(SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(street、 '、2)、' '、-1))' – miknik

答えて

0

わかりましたので、上記のコメント/アドバイスを聞いた後、そして私の特定のuse-の詳細を与えられました(文字列の最初のスペースは、使い捨ての情報である前に、私は一般的にちょうどその何かを想定することができます)の場合、私は実際には非常にうまく機能し、次のクエリ、になってしまった:

SELECT 
    SUBSTRING(`street`,LOCATE(' ',`street`)+1,LENGTH(`street`)) AS `streetSearch` 
FROM `addresses` 
WHERE `street` LIKE ('%searchTerm%') 
GROUP BY SUBSTRING(`street`,LOCATE(' ',`street`)+1,LENGTH(`street`)) 
ORDER BY LOCATE('searchTerm',`street`) 
LIMIT 10; 

私はトンがあることを実感しながら私が扱っているテーブルのデータを考えれば、このソリューションは99%以上の時間で動作します(つまり、fこれまでのテストでは、アース・ポジティブ/ネガティブ)。

ありがとうございます!

1

私の理解では、パターン '%searchTerm%'の最も近いスペースを見つけることによって通りの名前全体を分ける必要があります。 MySQLで実現可能ですが、コードで実行することをお勧めします。あなたが実際にデータベースのレベルでそれを必要とする場合、私はそれをfunctionに入れます。

これはMySQLで動作するコードです。 (いくつかの変更後のクエリでそれを使用することが可能である - 私はそれをお勧めしませんが:))

SET @STREET='tree'; 
SET @HAYSTACK='Some man lives at some street 15 in some town in some country'; 
SET @STREET_START=locate(@STREET, @HAYSTACK) ; 
-- first space 
SET @[email protected]_START - (SELECT locate(' ', 
reverse(substring(@HAYSTACK,1, @STREET_START)))) + 1; 
-- last space 
SET @FULL_STREET_END=LENGTH(@STREET) + locate(' ', 
substring(@HAYSTACK,@STREET_START+LENGTH(@STREET))) + 1; 
SELECT substring(@HAYSTACK, @FULL_STREET_START, @FULL_STREET_END); 
-- result 
+------------------------------------------------------------+ 
| substring(@HAYSTACK, @FULL_STREET_START, @FULL_STREET_END) | 
+------------------------------------------------------------+ 
| street             | 
+------------------------------------------------------------+ 
関連する問題