2017-09-09 1 views
1

Für eine Anwendung, die ich derzeit entwickle Ich habe ein kleines Problem, das behoben werden muss, ist es für die niederländische ausgerichtet, so dass ich eine Tabelle aller niederländischen Postleitzahlen, die ich verwenden kann.MySQL wählt Bereiche aus Abfrage Ergebnis

In meiner Anwendung muss ich Regionen basierend auf Cities erstellen und das ist, wo ich ein Problem treffe, derzeit wähle ich die erste und letzte bekannte Postleitzahl einer Stadt, die in den meisten Fällen in Ordnung ist. Das ist in den meisten Fällen gut, aber manchmal funktioniert das nicht, weil eine Postleitzahl vor einer anderen Stadt nummeriert ist, was bedeutet, dass in manchen Fällen eine Stadt mit einer anderen übereinstimmt.

Was ich möchte, ist, alle Bereiche mit meiner Stadt von meinem Tisch zu bekommen. Dies ist ein kleines Beispiel, wie die Tabelle aussieht (es fehlen einige nicht benötigte Felder für diese Datei).

Zipcode | City --------|------- 2411 AA | Bodegraven 2411 AB | Leiden 2411 AC | Leiden 2411 AD | Bodegraven 2411 AE | Bodegraven 2411 AF | Leiden 2411 AG | Leiden 2411 AH | Bodegraven

Mit meiner aktuellen Abfrage der erste zipcode in Bodegraven wäre 2411 AA und der letzte 2411 AH, die nicht interly falsch ist, denn das ist, was gespeichert wird. Allerdings würde ich mein Ergebnis wie die folgenden sein:

Start | End --------|-------- 2411 AA | 2411 AA 2411 AD | 2411 AE 2411 AH | 2411 AH

Ist es möglich, mit reinem MySQL dieses Ergebnis zu generieren?

Vielen Dank für Ihre Zeit und Antworten, wenn Sie Fragen haben mich :)

+0

"Ist es möglich, mit pure MySQL" Ich würde sagen nein, was Sie wollen, würde auf Zeile Position basieren und es gibt keine Zeilennummer in mysql –

Antwort

2

Diese in MySQL wissen lassen Sie es sehr umständlich ist, aber es ist möglich.

Zuerst müssen wir eine Art dynamisch definieren eine Art "Gruppe" Kennung, die erhöht, wenn die Stadt von Zeile zu Zeile ändert. Wir können dies mit MySQL user-defined variables tun.

SELECT zipcode, 
    @groupid:=IF([email protected]_city,@groupid,@groupid+1) AS groupid, 
    @prev_city:=city AS city 
FROM MyTable, (SELECT @groupid:=0) AS _init 
ORDER BY zipcode; 

+---------+---------+------------+ 
| zipcode | groupid | city  | 
+---------+---------+------------+ 
| 2411 AA | 0  | Bodegraven | 
| 2411 AB | 1  | Leiden  | 
| 2411 AC | 1  | Leiden  | 
| 2411 AD | 2  | Bodegraven | 
| 2411 AE | 2  | Bodegraven | 
| 2411 AF | 3  | Leiden  | 
| 2411 AG | 3  | Leiden  | 
| 2411 AH | 4  | Bodegraven | 
+---------+---------+------------+ 

Jetzt können wir dies in einer abgeleiteten Tabelle Unterabfrage verwenden und erhalten die MIN() und MAX() Wert in jeder Gruppe:

SELECT MIN(zipcode) AS Start, MAX(zipcode) AS End 
FROM (
    SELECT zipcode, 
     @groupid:=IF([email protected]_city,@groupid,@groupid+1) AS groupid, 
     @prev_city:=city AS city 
    FROM MyTable, (SELECT @groupid:=0) AS _init 
    ORDER BY zipcode 
) AS t 
WHERE city = 'Bodegraven' 
GROUP BY groupid; 

+---------+---------+ 
| Start | End  | 
+---------+---------+ 
| 2411 AA | 2411 AA | 
| 2411 AD | 2411 AE | 
| 2411 AH | 2411 AH | 
+---------+---------+ 

Leider ist der Zustand der WHERE city='Bodegraven' im äußeren sein müssen Abfrage. Die Unterabfrage muss die Gruppierungen generieren, indem sie alle Zeilen liest, nicht nur für Bodegraven. Es muss also viele Zeilen durchsuchen (vielleicht können Sie es auf die Min- und Max-Postleitzahlen für Bodegraven beschränken).

+0

Vielen Dank, das ist genau das, was ich brauche :) Running this in meiner CMD gibt das korrekte Ergebnis, aber durch meine PHP Yii2 PDO-Verbindung geht es nicht gruppiert sie von Anfang bis Ende, sondern nur jede einzelne Postleitzahl als eine einzelne Aufzeichnung, gibt es etwas, das ich vermisse? Meine Abfrage: SELECT MIN (postcode_id) AS Start, MAX (postcode_id) AS End, groupid FROM ( SELECT postcode_id, \t @groupid: = IF (Stadt = @ prev_city, @ groupid, @ groupid + 1) AS groupid, \t @prev_city: = Stadt als Stadt FROM 'postcode', (SELECT @groupid: = 0) als _init ORDER BY postcode_id ) AS t WHERE city = GROUP BY groupid 'Utrecht'; –

+0

Sind bei der Sortierung nach Postleitzahlen die Postleitzahlen in den Originaldaten für Utrecht mit anderen Städten verschachtelt, so dass es keine Folgen mehr als einer Postleitzahl hintereinander gibt? –

+0

Jede Postleitzahl ist eine eindeutige Zeile in der Tabelle, und wenn ich durch die Tabelle gehe, kann ich sehen, dass Utrecht vier oder mehr Städte zwischen seiner ersten Postleitzahl und der letzten Postleitzahl im Geschäft eingegeben hat. Hoffe das hilft. Was ich seltsam finde ist, dass die Kommandozeile das korrekte Ergebnis liefert, wo die PHP-Ausführung sie einfach nicht gruppiert. –