Suche nach einer Bedingung
Hank the knife and the Jetset
- datenbank
Hallo,
ich habe in mysql 5 eine Spalte deren Werte immer so aussehen:
AB-55-22-3432
Mich interessiert hierbei nur der 2 Teil des Inhalts. In diesem Fall die 55.
Und zwar würde ich gerne in die Bedingung einbauen
WHERE "der zweite Teil der Nummer maximal hoch ist"
Also würde bei den Werten
AB-55-21-3432
AB-55-20-3222
AB-55-20-3123
AB-55-20-3662
AB-60-20-3627
AB-55-20-34232
AB-55-20-31112
AB-55-92-34222
nur der Wert
AB-60-20-3627
relevant sein.
Geht das? Hat mysql so ne Art Substringmöglichkeit?
Hank
Tach!
Geht das? Hat mysql so ne Art Substringmöglichkeit?
Ja, das geht. Nochmal ja, MySQL hat eine Substring-Funktion und sogar reguläre Ausdrücke. Zu finden im MySQL-Handbuch-Kapitel Funktionen -> String-Funtionen.
dedlfix.
Auch tach,
Ja, das geht. Nochmal ja, MySQL hat eine Substring-Funktion und sogar reguläre Ausdrücke. Zu finden
Hab schon gefunden, aber WHERE MAX(SUBSTRING(Spalte,3,2)) liefert Fehler #1064.
Hank
Hab schon gefunden, aber WHERE MAX(SUBSTRING(Spalte,3,2)) liefert Fehler #1064.
Nein, doch Fehler #1111 - Invalid use of group function
Hank
Tach!
Hab schon gefunden, aber WHERE MAX(SUBSTRING(Spalte,3,2)) liefert Fehler #1064.
Nein, doch Fehler #1111 - Invalid use of group function
Ach, den Maximalwert, das Detail hatte ich überlesen. Aber im Prinzip ist SUBSTRING() schon der richtige Weg. Sortier anschließend nach diesem Wert absteigend und nimm LIMIT 1.
Das läuft am Ende auf einen Full-Table-Scan hinaus, aber das lässt sich bei der Datenlage nicht vermeiden.
dedlfix.
Ach, den Maximalwert, das Detail hatte ich überlesen. Aber im Prinzip ist SUBSTRING() schon der richtige Weg. Sortier anschließend nach diesem Wert absteigend und nimm LIMIT 1.
Ok. Funktioniert prächtig.
Jetzt habe ich dooferwesie aber festgestellt, dass es ein paar Einträge ala
ABC-55-78787 gibt, also mit 3 Buchstaben vor der relevanten 2-stelligen Zahl.
Bekommt man das mit nem IF-Statement und Substring und Order und Limit hin?
Hank
Tach!
Jetzt habe ich dooferwesie aber festgestellt, dass es ein paar Einträge ala
ABC-55-78787 gibt, also mit 3 Buchstaben vor der relevanten 2-stelligen Zahl.
Bekommt man das mit nem IF-Statement und Substring und Order und Limit hin?
RegExp hatte ich vorhin schon gesagt, aber das geht doch nicht. Dummerweise kann das MySQL-RegExp nur "entspricht dem Muster"-Aussagen aber nicht Teilausdrücke davon liefern.
Ein IF-Statement nützt dir hier nichts, aber die IF()-Funktion könnte gehen. Einfacher wird es jedoch mit SUBSTRING_INDEX() sein. Such damit die Position des ersten '-' und schneide von da +1 zwei Zeichen aus.
dedlfix.
Ein IF-Statement nützt dir hier nichts, aber die IF()-Funktion könnte gehen. Einfacher wird es jedoch mit SUBSTRING_INDEX() sein. Such damit die Position des ersten '-' und schneide von da +1 zwei Zeichen aus.
Tach,
ich erhalte aber nicht das, was ich will.
SELECT ID, SUBSTRING( Nummer, -10, 2 )
FROM table
WHERE ID > 3
ORDER SUBSTRING( Nummer, -10, 2 ) DESC
liefert mir zwar die höchste Nummer aber zugleich die kleinste ID.
Ich möchte aber die höchste ID haben, die den höchsten Nummernwert inne hat.
AB-55-21-3432
AB-60-20-3222
AB-55-20-3123
AB-55-20-3662
AB-60-20-3627
AB-55-20-3423
AB-55-20-3111
AB-55-92-3422
Hier erhalte ich ID 2. Ich bräuchte aber ID 5.
Hank
Tach!
ich erhalte aber nicht das, was ich will.
Dann musst du deine Bedingung(en) genauer formulieren.
SELECT ID, SUBSTRING( Nummer, -10, 2 )
FROM table
WHERE ID > 3
ORDER SUBSTRING( Nummer, -10, 2 ) DESC
>
> liefert mir zwar die höchste Nummer aber zugleich die kleinste ID.
Du wertest nur den zweiten Teil des Ausdrucks aus, und dann stehen alle 60er vorn, aber innerhalb derer ist keine Reihenfolge definiert.
> Ich möchte aber die höchste ID haben, die den höchsten Nummernwert inne hat.
Definiere "Nummernwert" und bau ihn in die Sortierbedingung ein.
dedlfix.
N'abend.
Du wertest nur den zweiten Teil des Ausdrucks aus, und dann stehen alle 60er vorn, aber innerhalb derer ist keine Reihenfolge definiert.
Richtig.
Ich möchte aber die höchste ID haben, die den höchsten Nummernwert inne hat.
Definiere "Nummernwert" und bau ihn in die Sortierbedingung ein.
Ist es nicht so, dass ich das bereits mache, aber die ID in der Sortierbedingung fehlt?
Ich verstehe das nicht.
Hank
Tach!
Ich möchte aber die höchste ID haben, die den höchsten Nummernwert inne hat.
Definiere "Nummernwert" und bau ihn in die Sortierbedingung ein.
Ist es nicht so, dass ich das bereits mache, aber die ID in der Sortierbedingung fehlt?
Nein. Dein Sortierkriterium sind lediglich die zwei Zeichen ab Position -10. Wenn du weitere Bestandteile von dem Feldinhalt heranziehen möchtest, musst du die ebenfalls erst einmal extrahieren.
dedlfix.
Nein. Dein Sortierkriterium sind lediglich die zwei Zeichen ab Position -10. Wenn du weitere Bestandteile von dem Feldinhalt heranziehen möchtest, musst du die ebenfalls erst einmal extrahieren.
Ich wollte eigentlich keinen weiteren Inhalt des Feldinhaltes in die Sortierung einbeziehen, sondern die ID. Aber ID und (bisher) einbezogener Feldinhalt scheinen sich zu wiedersprechen?
Du meinst, ich sollte nicht die ID, sondern die letten 4 Ziffern mit einbeziehen?
Hank
Tach!
Nein. Dein Sortierkriterium sind lediglich die zwei Zeichen ab Position -10. Wenn du weitere Bestandteile von dem Feldinhalt heranziehen möchtest, musst du die ebenfalls erst einmal extrahieren.
Ich wollte eigentlich keinen weiteren Inhalt des Feldinhaltes in die Sortierung einbeziehen, sondern die ID. Aber ID und (bisher) einbezogener Feldinhalt scheinen sich zu wiedersprechen?
Nein, du kannst gern auch noch nach der ID sortieren, die du dann als zweites Kriterium im ORDER BY unterbringen musst. Aber eine ID hat zu identifizieren. Niemand garantiert, dass für die ID Werte in einer bestimmten Reihenfolge vergeben werden (wenn man sie nicht selbst festlegt) - auch wenn das (bei auto_increment) de facto so ist.
Du meinst, ich sollte nicht die ID, sondern die letten 4 Ziffern mit einbeziehen?
Ich kenne deine Daten nicht. Aber eine ID als Ordnungskriterium ist für mich eigentlich kein Teil einer bevorzugten Lösung. Ich dachte, du wolltest in Wirklichkeit nach dem letzten Teil des Feldinhalts sortieren, denn das passte (vielleicht nur zufällig) auch auf deine Beispieldaten.
Was auch immer du am Ende nimmst, es muss mit ins ORDER BY.
dedlfix.
Was auch immer du am Ende nimmst, es muss mit ins ORDER BY.
Jau, es funktioniert nur nicht (bei mir).
SELECT ID, SUBSTRING( Nummer, -10, 2 )
FROM table
WHERE ID > 3
ORDER SUBSTRING( Nummer, -10, 2 ),ID DESC
ergibt ebenfalls ein falsches Ergebnis.
Und
SELECT ID,
SUBSTRING(Nummer,-10,2),
SUBSTRING(Nummer,-4,4)
FROM table
where
ID > 3
ORDER BY SUBSTRING(Nummer,-10,2),SUBSTRING(Nummer,-4,4) DESC
ergibt auch ein falsches Ergebnis :-(
Sch...ße, wenns nicht irrsinnig dringend wäre, würde ich besser für heute aufhören, aber es muß morgen früh laufen. :-(
Hank
SELECT ID, SUBSTRING( Nummer, -10, 2 ) , SUBSTRING( Nummer, -4, 4 )
FROM table
WHERE ID >3
ORDER BY SUBSTRING( Nummer, -10, 2 ), SUBSTRING( Nummer, -4, 4 ) DESC
ergibt
ID Nr lfd.NR.
9 12 6444
12 13 0009
7 13 0004
6 13 0003
13 13 0002
4 13 0001
Ich möchte aber
ergibt
ID Nr lfd.NR.
12 13 0009
...
P.S: An den IDs habe ich rumgewerkelt. Die stimmen also (trotz ai) nicht mehr überein.
Hank
Tach!
ORDER SUBSTRING( Nummer, -10, 2 ),ID DESC
ergibt ebenfalls ein falsches Ergebnis.
Jedes Kriterium braucht sein eigenes DESC. So wie du das notiert hast, hat das SUBSTRING() keins und wird ASC sortiert. Also schreib noch ein DESC vor das Komma.
dedlfix.
dedlfix?
Mensch, das rettet mir grad "den Kragen"!
Danke. Danke. Danke!
Kann man denn auch 1 x DESC und 1 x ASC machen?
Also ORDER BY spalte1 DESC, spalte2 ASC????
Hank
Tach!
Kann man denn auch 1 x DESC und 1 x ASC machen?
Das hast du ja schon unwillentlich gemacht. Jedes Kriterium kann seine eigene Sortierrichtung haben und ASC kann man weglassen.
dedlfix.
Das hast du ja schon unwillentlich gemacht. Jedes Kriterium kann seine eigene Sortierrichtung haben und ASC kann man weglassen.
Ich dachte wirklich, das geht nicht.
Dedlfix! Danke für Deine Hilfe.
Für mich persönlich bist Du das "selfforum"!
Gute N8.
Hank