2017-12-30 38 views
-1

私はカラムがあるテーブル 'places'を持っています:id(ユニーク)、名前、郵便。名前は複製できます。LIKEステートメントと組み合わせたユニークなカラムを取得

名前を重複する名前ではなく、needleで始まる最初の20個のレコードを検索するクエリを実行したいとします。これは、ajaxのライブ検索用です。 ポイントは、これを郵便と組み合わせる必要があるということです。なぜなら、私は異なる地域の場所をカットしたくないからです。最初の2桁の郵便で十分です。データの

例:

id name postal 
1 Bradford BD83CB 
2 Bradford BD74RT 
3 Keighley BD215CT 
4 Bradford CC763DD 
5 Braster DD339CL 

ここで針は、ID 4を持つレコードからブラッドフォードからブラッドフォード以外の領域にあるので、結果は、1と4と5のIDが含まれている必要があり 「ブラ%」であります私が試したどのようなID 1と2

SELECT id, `name`, postal FROM places WHERE `name` LIKE 'needle%' GROUP BY `name` LIMIT 20 

しかし、それは、十分ではありませんもちろん、このカットはすべてnamesと私は持っていないので、 IDが1、4、5のレコードですが、IDは1のみです。私はどこかの条件に郵便番号を追加する必要があります。

最後に、できるだけ早くAjax検索を行う必要があります。

高性能でこれを見つけるオプションがない場合は、列searchableに可能な値0と1を追加し、where文でこれを使用することを検討します。

+0

を実行していますか?国の列もありますか? – SMA

+0

国については何もせず、国には列がありません。彼らが同じである場合よりも郵便物の決定の最初の2文字だけが、同じ郡/地域にあります。 – nexequ

+0

https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-クエリ – Strawberry

答えて

1

これは動作しますが、パフォーマンスをテストすることはできません。

DROP TABLE IF EXISTS T; 
CREATE TABLE T (id INT,name VARCHAR(20), postal VARCHAR(10)); 
INSERT INTO T VALUES 
(1, 'Bradford' ,'BD83CB'), 
(2, 'Bradford' ,'BD74RT'), 
(3, 'Keighley' ,'BD215CT'), 
(4, 'Bradford' ,'CC763DD'), 
(5, 'Braster' ,'DD339CL'); 


SELECT ID,NAME,POSTAL 
FROM T 
WHERE ID = (SELECT MIN(ID) FROM T T1 WHERE T1.NAME = T.NAME AND LEFT(T1.POSTAL,2) = LEFT(T.POSTAL,2)) 
AND NAME LIKE 'BRA%' 
; 

結果

+------+----------+---------+ 
| ID | NAME  | POSTAL | 
+------+----------+---------+ 
| 1 | Bradford | BD83CB | 
| 4 | Bradford | CC763DD | 
| 5 | Braster | DD339CL | 
+------+----------+---------+ 
3 rows in set (0.00 sec) 
+0

それは動作します、ありがとう:) – nexequ

1

私はこの1つはよりシンプルだと思うし、より優れた性能を持っています。

SELECT id, `name`, postal, substring(postal, 1, 2) FROM places WHERE `name` LIKE 'Bra%' GROUP BY substring(postal, 1, 2); 

はまた、このバージョンでは、私は郵便Aおよび郵便bは二つの異なる国に属していることを知っていますどのように設定して(maridb 10.1.29)

SELECT id, `name`, postal FROM places WHERE `name` LIKE 'Bra%' GROUP BY substring(postal, 1, 2); 

+------+----------+---------+ | id | name | postal | +------+----------+---------+ | 1 | Bradford | BD83CB | | 4 | Bradford | CC763DD | | 5 | Braster | DD339CL | +------+----------+---------+ 3 rows in set (0.00 sec)

関連する問題