Bir Mesafe ve Kelime SQL sorgusu birleştirmek nasıl?

3 Cevap php

Ben "puan" ve "kategori" olarak adlandırılan benim veritabanında bir tablo var. Bir kullanıcı olacak bir konum giriş ve bir anahtar kelime giriş metin kutusuna hem de içine giriş bilgisi.

Sonra anahtar kelime puan tablosunda "title" alanını, ya da "kategori" ya maçlar nerede benim tabloda noktaları bulmak istiyorum ama kullanıcının yerden belli bir mesafede bulunmaktadır. Ben Mesafeye göre sonuçlarını sipariş etmek istiyorum.

Burada bağımsız çalışma btoh 2 sorgular şunlardır:

$mysql = "SELECT *, ( 3959 * acos( cos( radians('$search_lat') ) * cos( radians( lat ) ) * cos( radians( longi ) - radians('$search_lng') ) + sin( radians('$search_lat') ) * sin( radians( lat ) ) ) ) AS distance FROM points HAVING distance < '$radius'";

$mysql2 =  "SELECT * FROM `points` LEFT JOIN category USING ( category_id ) WHERE (point_title LIKE '%$esc_catsearch%' OR category.title LIKE '%$esc_catsearch%')";

İşte ben denedim budur:

$sql_search = sprintf("SELECT *,point_id FROM points WHERE point_title LIKE '%%%s%%' UNION SELECT *, ( 3959 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( longi ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance FROM points HAVING distance < '%s' ORDER BY distance LIMIT %d , %d",

 $esc_catsearch,
 mysql_real_escape_string($search_lat),

 mysql_real_escape_string($search_lng),

 mysql_real_escape_string($search_lat),

 mysql_real_escape_string($radius),

 $offset,

 $rowsPerPage);

Ama hiçbir bilgi sütunu "mesafe" olduğunu söylüyor. Ben "Siralama" ifadesini kaldırırsanız o zaman çalışıyor ama ben yine de bu bana istediğim sonuçlar veriyor emin değilim. Ben de ilk mesafe arama ile başka bir yol etrafında sorgu çalıştı ama bu benim bir kelime yok gibi görünüyor.

Herhangi bir düşünce çok takdir!

3 Cevap

Belki yerine birlik kullanarak, bir alt sorgu olarak uzaklık sorguyu çalıştırabilir, sonra anahtar kelime araması neticesinde olanları almak için (geçici bir tablo olarak tedavi) o SELECT? Aslında, genel formunun bir ...

SELECT * FROM (SELECT * FROM ... WHERE distance < X) as distResults WHERE ....

Veya potansiyel etrafında başka bir yol - sonra bu sonuçları almak ve uzaklık arayacaksınız için bunları kullanmak için, öncelikle anahtar kelime arayacaksınız. Hangi yol en hesaplama yükü ortadan kaldıracaktır.

Ben size birliğin ilk bölümünde sütun diğer adı olması gerektiğini düşünüyorum:

 $sql_search = sprintf("SELECT *,point_id as distance FROM...

Teşekkürler çocuklar. Ben bu sorguyu kullanarak işe almak mümkün:

SELECT *,point_id FROM (SELECT *, ( 3959 * acos( cos( radians('37.7749295') ) * cos( radians( lat ) ) * cos( radians( longi ) - radians('-122.4194155') ) + sin( radians('37.7749295') ) * sin( radians( lat ) ) ) ) AS distance FROM points HAVING distance < '25') as distResults LEFT JOIN category USING ( category_id ) WHERE (point_title LIKE '%test%' OR category.title LIKE '%test%') ORDER BY distance LIMIT 0 , 10

Teşekkürler!