php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 10.11.2008, 16:39  
Neuer Benutzer
 
Registriert seit: 10.11.2008
Beiträge: 5
williwutz2008 befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] Select Where IN liefert nur einen Teil der Ergebnisse

Hallo liebe Forenteilnehmer,

ich bastle an einer MySQL DB und komme mit der "Mengenlehre" von MySQL und/oder von PHP (jeweils in Fünferversion von 1blu.de) nicht zurecht.

Zehneinhalb von elf Abfragesystemen laufen korrekt. Eines weigert sich hartnäckig. Hilfreiche Anregungen und Tips nehme ich gern an.

Konkret soll bei einer Query ermittelt werden, ob bestimmte Werte Elemente
einer bekannten Menge sind. Diese "Menge" ist sinnvollerweise als String in der Table angelegt. Die im jeweiligen DS tatsächlich vorhandenen Elemente davon!

Die Werte sind mit Komma getrennt. Es handelt sich um Zahlenwerte mit maximal zwei Stellen. (1,2, ..22)

Damit wollte ich das Umformen in Arrays zur Laufzeit vermeiden. Meiner Ansicht nach müsste eine Abfrage der Form

"select *from k, a where k.artist = a.id and vis =1 and foto >0 and (2 in (mat) or 3 in (mat) or 4 in (mat) or 5 in (mat) or 6 in (mat) or 7 in (mat) or 8 in (mat) or 9 in (mat) or 10 in (mat) or 11 in (mat) or 12 in (mat) or 13 in (mat) or 14 in (mat) or 15 in (mat) or 16 in (mat) or 17 in (mat) or 18 in (mat) or 19 in (mat) or 20 in (mat) or 21 in (mat) or 22 in (mat))"

ermitteln, ob (mindestens) ein Element der zulässigen Werte - also 2 bis 22 - in der "Mengenspalte" (mat = Materialien) ist. mat ist ein Varchar(64).

Leider wird anscheinend nur das erste Element "angeschaut". So fehlen mir etliche Ergebniszeilen bei der Abfrage.

Was mache ich falsch? Gibt es Settings für MySQL, die Suchen nach ALLEN Elementen ermöglichen, unabhängig von deren Reihenfolge?!?

Beste Grüße, williwutz2008
williwutz2008 ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 10.11.2008, 16:53  
Moderator
 
Benutzerbild von agrajag
 
Registriert seit: 02.10.2006
Beiträge: 3.820
PHP-Kenntnisse:
Fortgeschritten
agrajag wird schon bald berühmt werdenagrajag wird schon bald berühmt werden
Standard

Du hast IN() fehlverstanden. IN() prüft nicht ob in einem String ein bestimmter Text vorkommt... das könntest du zum Beispiel mit "WHERE mat LIKE '%22%'" machen, solltest du aber nicht:

Es ist in den meisten Fällen nicht sinnvoll in ein Feld (in deinem Fall mat) mehrere Werte zu speichern. (Stichwort: Normalisierung)
__________________
Today you...Tomorrow me.
agrajag ist offline   Mit Zitat antworten
Alt 10.11.2008, 17:03  
Benutzer
 
Registriert seit: 26.09.2005
Beiträge: 52
BlackHawkDC
Standard

ich muss mich agrajag anschliessen. In ist ein Mengenoperator und kann nicht auf einen String angewendet werden. Ich kann deine Motivation verstehen, ein Array zur Laufzeit nicht auseinander zu nehmen und Normalisierung ist für dich sicher ein Fremdowrt.

versuche es doch mal mit dem Datentyp Set anstatt Varchar.

siehe: MySQL :: MySQL 5.1 Referenzhandbuch :: 11.4.5 Der Spaltentyp SET
__________________
--
kostenlose geschenklisten unter www.wunli.de
BlackHawkDC ist offline   Mit Zitat antworten
Alt 10.11.2008, 17:08  
Neuer Benutzer
 
Registriert seit: 10.11.2008
Beiträge: 5
williwutz2008 befindet sich auf einem aufstrebenden Ast
Standard

Danke agrajag,

für die umgehende Antwort. Aber was ist dann IN? Ich verstehe es so, dass IN prüft, ob ein Element in der mit Klammern umschlossenen "Menge" (Liste) mit einem oder mehr Elementen zu finden ist.

Like hat zumindest bei einstelligen Zahlen (1,2,3) das unangenehme Problemchen, auch 10 bzw. 20 auszugeben. Das ist nicht gewünscht.

Für die andere Teilabfrage, nämlich zu id=1, habe ich "...and 1 in (mat)" recht erfolgreich eingesetzt. Dort ist aber natürlich auch meist der erste Eintrag die eins ("1"). Bei den anderen Materialien kann AUCH die 1 gesetzt sein. Nur solche Elemente werden nicht gezeigt. UND manchmal auch nicht die weiteren Elemente nach dem ersten Treffer.

Normalisierung ist hier bewusst aussen vorgelassen worden. Die Altdaten sind für die Kunden in einer dem früheren Modell möglichst nahekommenden und schnellen Form gespeichert. Es sind > 1.800 DS mit Kunstwerken. Ursprünglich auf einer alten PC-"Datenbank", jetzt in zehn MySQL-Tabellen.

Zitat:
Zitat von agrajag Beitrag anzeigen
Du hast IN() fehlverstanden. IN() prüft nicht ob in einem String ein bestimmter Text vorkommt... das könntest du zum Beispiel mit "WHERE mat LIKE '%22%'" machen, solltest du aber nicht:

Es ist in den meisten Fällen nicht sinnvoll in ein Feld (in deinem Fall mat) mehrere Werte zu speichern. (Stichwort: Normalisierung)
Den Sinn (der Nicht-Normalisierung) habe ich darin gesehen, KEINE Arrays aus den mehreren, aber in jedem Fall unterschiedlich vielen (0 bis 23 Einträge an Materialien können drin sein) Materialien zur Skriptlaufzeit zimmern zu müssen.

Vielleicht wird das "Problem" bzw. meine Frage jetzt klarer?

Gruß williwutz2008

Geändert von williwutz2008 (10.11.2008 um 17:27 Uhr).
williwutz2008 ist offline   Mit Zitat antworten
Alt 10.11.2008, 17:18  
Neuer Benutzer
 
Registriert seit: 10.11.2008
Beiträge: 5
williwutz2008 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von BlackHawkDC Beitrag anzeigen
ich muss mich agrajag anschliessen. In ist ein Mengenoperator und kann nicht auf einen String angewendet werden. Ich kann deine Motivation verstehen, ein Array zur Laufzeit nicht auseinander zu nehmen und Normalisierung ist für dich sicher ein Fremdowrt.

versuche es doch mal mit dem Datentyp Set anstatt Varchar.

siehe: MySQL :: MySQL 5.1 Referenzhandbuch :: 11.4.5 Der Spaltentyp SET
Danke BlackHawk,

ganz so fremd ist mir Normalisierung nicht. Habe nur seit Ewigkeiten nicht mehr mit PHP und MySQL zu tun gehabt...

... und hatte tatsächlich gedacht, für das Set in der Where IN-Klausel einen geeigneten Ersatz gefunden zu haben.

Danke auch für den Link ins Handbuch, Williwutz2008
williwutz2008 ist offline   Mit Zitat antworten
Alt 10.11.2008, 17:29  
Neuer Benutzer
 
Registriert seit: 10.11.2008
Beiträge: 5
williwutz2008 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von williwutz2008 Beitrag anzeigen
Danke agrajag,

für die umgehende Antwort. Aber was ist dann IN? Ich verstehe es so, dass IN prüft, ob ein Element in der mit Klammern umschlossenen "Menge" (Liste) mit einem oder mehr Elementen zu finden ist.

Like hat zumindest bei einstelligen Zahlen (1,2,3) das unangenehme Problemchen, auch 10 bzw. 20 auszugeben. Das ist nicht gewünscht.

Für die andere Teilabfrage, nämlich zu id=1, habe ich "...and 1 in (mat)" recht erfolgreich eingesetzt. Dort ist aber natürlich auch meist der erste Eintrag die eins ("1"). Bei den anderen Materialien kann AUCH die 1 gesetzt sein. Nur solche Elemente werden nicht gezeigt. UND manchmal auch nicht die weiteren Elemente nach dem ersten Treffer.

Normalisierung ist hier bewusst aussen vorgelassen worden. Die Altdaten sind für die Kunden in einer dem früheren Modell möglichst nahekommenden und schnellen Form gespeichert. Es sind > 1.800 DS mit Kunstwerken. Ursprünglich auf einer alten PC-"Datenbank", jetzt in zehn MySQL-Tabellen.



Den Sinn (der Nicht-Normalisierung) habe ich darin gesehen, KEINE Arrays aus den mehreren, aber in jedem Fall unterschiedlich vielen (0 bis 23 Einträge an Materialien können drin sein) Materialien zur Skriptlaufzeit zimmern zu müssen.

Vielleicht wird das "Problem" bzw. meine Frage jetzt klarer?

Gruß williwutz2008
Hallo BlackHawk,

gibt es eine einfache Option, den String der Art '1,5,21' in ein Set zu überführen, das iach eben als Ersatzspalte angelegt habe?

Wäre Dir superdankba für einen weiteren klugen Hinweis, williwutz2008
williwutz2008 ist offline   Mit Zitat antworten
Alt 10.11.2008, 17:40  
Moderator
 
Benutzerbild von agrajag
 
Registriert seit: 02.10.2006
Beiträge: 3.820
PHP-Kenntnisse:
Fortgeschritten
agrajag wird schon bald berühmt werdenagrajag wird schon bald berühmt werden
Standard

Zitat:
Zitat von williwutz2008 Beitrag anzeigen
für die umgehende Antwort. Aber was ist dann IN? Ich verstehe es so, dass IN prüft, ob ein Element in der mit Klammern umschlossenen "Menge" (Liste) mit einem oder mehr Elementen zu finden ist.
Du hast aber keine Menge oder Liste sondern einen einfachen String...

Zitat:
Normalisierung ist hier bewusst aussen vorgelassen worden. Die Altdaten sind für die Kunden in einer dem früheren Modell möglichst nahekommenden und schnellen Form gespeichert. Es sind > 1.800 DS mit Kunstwerken. Ursprünglich auf einer alten PC-"Datenbank", jetzt in zehn MySQL-Tabellen.
Manchmal kann eine bewusste Denormalisierung schon sinnvoll sein. Aber in deinem Fall stellst du dir damit selbst ein Bein.
Ich speichere durchaus auch mal mehrere Werte in das selbe Feld (kommagetrennt oder serialisiert) - aber nicht bei Daten, bei denen ich weiß, dass ich genau darauf abfragen starten werde...


Ich befürchte du wirst da keine "schöne" Abfrage hinbekommen. Du könntest noch versuchen aus dem String per SQL eine Liste/Menge zu generieren (eine Art "explode()") ...oder dir irgendwas mit instr() und substr() basteln.
Oder das Problem mit einzelnen Ziffern bei LIKE umgehen, indem du mit einem regulären Ausdruck auf die Spalte losgehst und ein entsprechendes Pattern definierst, bei dem die 1 in der 10 eben nicht gematcht wird...

Aber das sind also nur halbgare Ideen, die ich jetzt nicht besonders durchgedacht habe
__________________
Today you...Tomorrow me.
agrajag ist offline   Mit Zitat antworten
Alt 10.11.2008, 17:50  
Benutzer
 
Registriert seit: 26.09.2005
Beiträge: 52
BlackHawkDC
Standard

update TABELLE set mat_set = mat
könnte funktionieren.
__________________
--
kostenlose geschenklisten unter www.wunli.de
BlackHawkDC ist offline   Mit Zitat antworten
Alt 10.11.2008, 19:43  
Neuer Benutzer
 
Registriert seit: 10.11.2008
Beiträge: 5
williwutz2008 befindet sich auf einem aufstrebenden Ast
Standard

Hallo BlackHawkDC und agrajag,

Danke für alle Hinweise.

Der letzte Tip von BlackHawkDC hat offenbar funktioniert. Dachte schon, die ganzen Daten nochmal importieren zu müssen.

Bis später, williwutz2008
williwutz2008 ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Kein Ergebnis bei SELECT (MySQL 4.1.9) dr.e. Datenbanken 4 15.06.2008 19:54
where abfrage liefert zu viele ergebnisse phpdummi Datenbanken 9 22.01.2007 22:54
Parsen von Delimitern Basti Tutorials 0 30.09.2006 21:24
SELECT ... WHERE ... Nur ein User! Mike² Datenbanken 1 30.09.2006 19:15
»SELECT `feld` ... WHERE NOT `feld`« liefert Zeilen, wieso? tapferesschneiderlein Datenbanken 2 15.05.2006 21:46
SELECT WHERE datetime abfrage - Optimierung mrSpok Datenbanken 15 23.03.2006 19:08
[Erledigt] select where TIME Datenbanken 7 17.02.2006 12:40
Select - doppelte Ergebnisse ragman Datenbanken 3 26.01.2006 11:53
where -x- in (select...) klappt nicht Unbekanntes_Pferd Datenbanken 3 16.07.2005 14:36
Befehlsoptimierung faux Datenbanken 4 31.05.2005 19:11
SELECT FROM DB WHERE 2 SACHEN UEBEREINSTIMMEN Datenbanken 3 24.01.2005 15:58
SELECT FROM...WHERE id=(SELECT...) bicpi Datenbanken 4 24.10.2004 10:53
[Erledigt] SELECT Where id != 17 und nochwas..... Datenbanken 4 13.09.2004 15:22
[Erledigt] select ALLES from EGALWOHER where WASAUCHIMMER Datenbanken 1 01.06.2004 11:29

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
select where in, select * from where in, select from where in, seelct where in, php where in, mysql \where in\ string, mysql \where in\, select where nur das oder das, select im where teil, mysql where in kommagetrennt, mysql select where in list, ein teil in (select, script geschenkliste, mysql select max nur einstellig, where in select, mysql where in, mysql where in and, mysql select ergebnis kommagetrennt, mysql select serialisierte daten, php scripts geschenkliste

Alle Zeitangaben in WEZ +2. Es ist jetzt 03:31 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum