2009-08-18 6 views
1

ich einen Datensatz haben, die durch eine Postleitzahl Bereich Suche generiert:Mit Array „Keys“ in einer MySQL-WHERE-Klausel

$zips: 

key -> value 
11967 -> 0.5 
11951 -> 1.3 

Der Schlüssel ist die Postleitzahl (was ich für die Datenbank abfragen müssen), und der Wert ist die Meilen von der vom Benutzer eingegebenen Postleitzahl. Ich brauche den Schlüssel (PLZ) zu übernehmen und die Datenbank durchsucht, vorzugsweise eine MySQL-Abfrage ähnlich wie meine aktuellen Verwendung:

$getlistings = mysql_query("SELECT * FROM stores WHERE zip IN ($zips)"); 

Die andere Alternative ist das Array irgendwie in meinem Code zu ändern. Ich habe versucht, Code zu suchen, wo das Array ursprünglich generiert wurde, aber ich konnte es nicht finden. Jede Hilfe würde sehr geschätzt werden !! Danke :)

Antwort

1

array_keys sollte das sein, was Sie suchen.

$zip = array_keys($zips);  # gives you simple array(11967, 11951); 
implode(', ', $zip);   # results in: '11967, 11951' 
+0

Das funktioniert, solange die Spalte numerisch ist. Wenn es char ist, wird es nicht. –

+0

Ich dachte, wenn er Meilen verwendet, hat er sicherlich numerische Spalten;) – SilentGhost

+0

Hey, ich habe seltsame Dinge in Tabellen Definitionen da draußen gesehen. Man weiß nie. –

2

Sie könnten die Array-Schlüssel in eine SQL-kompatible Zeichenfolge konvertieren. Zum Beispiel:

'11967', '11951' 

und dann verwenden, um die Zeichenfolge in der Abfrage.

Da die SQL-Abfrage nicht weiß, was ein PHP-Array ist, und es gibt keine gute Möglichkeit (die ich kenne), nur die Schlüssel zu extrahieren und sie in Anführungszeichen zu umgeben, so könnte dies Ihre beste Wette sein.

EDIT: Wie Ionut G. Stan schrieb (und gab ein Beispiel für), mit der implode und array_map Funktionen erhalten Sie dort. Ich glaube jedoch, die angegebene Lösung funktioniert nur, wenn Ihre Spaltendefinition numerisch ist. Zeichenspalten würden erfordern, dass Elemente in der IN-Klausel von Apostrophen umgeben sind.

+0

Das war eines der Dinge, über die ich nachdachte, aber ich bin mir nicht sicher, wie ich das anstellen soll. Könnten Sie bitte ein Beispiel geben? :) –

0

Für eine optimale Leistung sollten Sie eine temporäre Tabelle, füllen Sie es mit Ihren Postleitzahlen und Abfrage wie folgt erstellen:

SELECT * 
FROM stores 
JOIN temptable 
ON  zip = tempvalue 

Natürlich ist dies effizienter sein wird, nur wenn Sie ZIP Spalte indiziert ist .

+0

Das ist interessant. Hast du irgendwelche Artikel in deinem Blog darüber? Irgendwelche Benchmarks? –

+0

'@ Ionut': noch kein Artikel (eine nette Idee' BTW', ich denke ich schreibe heute oder morgen), aber es ist (natürlich, wenn die Spalte indiziert ist). 'MySQL' scheint einen linearen Algorithmus irgendwo innerhalb der 'Bereich'-Transformation zu verwenden. – Quassnoi

0

Dies sollte es tun:

// array_map sanitizes the data 
$zip_codes = implode(', ', array_map('intval', array_keys($zips))); 
$getlistings = mysql_query("SELECT * FROM stores WHERE zip IN ($zip_codes)"); 
1

nicht die anderen Antworten kommentieren, so eine weitere Bemerkung von meiner Seite. Je nachdem, in welchem ​​Land Sie sich befinden und was Sie mit den Daten machen ... In Deutschland gibt es Postleitzahlen, die mit "0" beginnen. Sie sollten also sicherstellen, dass Sie sie nicht als numerischen Wert speichern, wenn Sie sie vergleichen möchten zu anderen Daten (zB ZIP < -> Geocoord-Mappings) oder stellen Sie sicher, dass Sie sie überall in int konvertieren und Filterung für die Ausgabe verwenden.

Alte Postleitzahlen hatten vier Nummern, neue haben fünf. Das Anzeigen eines neuen ZIP mit vier Zahlen, weil die führende 0 fehlt, führt zu Verwirrung.

In Bezug auf die Verwendung einer temporären Tabelle würde ich sagen, es hängt von der Größe der Tabelle und wie viele Postleitzahlen in der Abfrage verwendet werden.

0

Ich will nur einwerfen, dass die vorherigen Code-Schnipsel mir einige Syntaxfehler gaben und die Datenbank nur einen Eintrag statt aller relevanten Daten ausspuckte.Das folgende Snippet hat für mich funktioniert:

implode("','", $zipNumbers);