2016-08-25 2 views
1

Wie kombiniere ich die zwei $ SQL-Abfragen in eine $ SQL-Abfrage. Ich möchte einen Namen, eine Adresse, eine Stadt oder einen Bundesstaat eingeben und sie nur anzeigen lassen, wenn sie sich innerhalb eines angegebenen Längen- und Breitengradbereichs befinden. Ich habe viele Möglichkeiten versucht, diese $ sql zu einem zu kombinieren, aber ich kann die Logik nicht verstehen. Hilfe bitte.Wie Abfrageergebnisse nur angezeigt werden, wenn Länge und Breite in einer bestimmten Entfernung sind

$sql = "SELECT *, (3959 * acos(cos(radians(47.64585)) * cos(radians(lat)) * cos(radians(longitude) - radians(-117.159999)) 
+ sin(radians(47.64585)) * sin(radians(lat)))) AS distance FROM table HAVING distance > 100"; 

Die $ sql oben und die $ sql unten funktionieren beide gut, wenn getrennt ausgeführt. Ich habe nur den obigen $ sql-Code eingefügt und nicht alle Verbindungen und Dinge, die dazu gehören. Ich kann die gesamte Verbindung liefern und den Tabellencode bei Bedarf anzeigen. Ich werde auch Längen-, Breiten- und Entfernungsvariablen für meinen aktuellen Standort verwenden. Ich habe sie nur hart codiert, um meine Beispiele hoffentlich lesbarer zu machen.

$name = "text entered from search form"; 

$db= new pdo("mysql:host=localhost;dbname=$dbname",$username,$password); 
$sql="SELECT * FROM table WHERE  
    companyname LIKE '%" . $name . "%' 
    OR 
    address LIKE '%" . $name . "%' 
    OR 
    city LIKE '%" . $name ."%' 
    OR 
    state LIKE '%" . $name ."%'"; 

$result = $db->query($sql); 
$numrows=$result->fetch(PDO::FETCH_ASSOC); 

if ($result != false) { 
    while($row=$result->fetch(PDO::FETCH_ASSOC)){ 
    $client_id=$row['client_id']; 
    $companyname =$row['companyname']; 
    $address=$row['address']; 
    $city=$row['city']; 
    $state=$row['state']; 

echo $client_id, $companyname, $address, $city, $state; 

} 
} 
$result = null; 

Antwort

0

Fügen Sie einfach die WHERE-Klausel aus Ihrer zweiten Abfrage an die erste.

SELECT *, 
    (3959 * acos(cos (radians(47.64585)) 
     * cos(radians(lat)) 
     * cos(radians(longitude) - radians(-117.159999)) 
     + sin(radians(47.64585)) 
     * sin(radians(lat)) 
     ) 
    ) AS distance 
FROM table 
WHERE  
    companyname LIKE '%" . $name . "%' 
    OR address LIKE '%" . $name . "%' 
    OR city LIKE '%" . $name ."%' 
    OR state LIKE '%" . $name ."%' 
HAVING distance > 100 

Eine Warnung diese Abfrage aber wird nutzen können, um alle Indizes auf den Feldern in der where-Klausel mit dem typischen B-Baum-Index nicht. Das liegt daran, dass Sie am Anfang der LIKE-Definition einen Platzhalter für die Suchwerte haben und typische B-Tree-Indizes nur Anwendungsfälle mit Präfixübereinstimmung unterstützen. Möglicherweise möchten Sie die Suche in natürlicher Sprache für diesen Anwendungsfall in Betracht ziehen.

Möglicherweise müssen Sie auch die räumliche Ausdehnung von MySQL in Betracht ziehen, wenn Sie die Geodatenfunktionalität erheblich nutzen möchten. Dies ermöglicht unter anderem spezielle Feld- und Indextypen, die für das Arbeiten mit räumlichen Daten optimiert sind.

Verwandte Themen