Liebe Community,
ich möchte gern Einträge aus der Tabelle A anhand ihrer ID auslesen. Die IDs sind in Tabelle B in einem Feld durch Komma getrennt gespeichert.
Tabelle A
ID - NAME
1 - Test
2 - Hallo
3 - Wikipedia
4 - Fjalorth
...
7 - Google
8 - Winfuture-forum
..
323 - Bing!
Tabelle B
ID - NAME - IDS
1 - beruehmt - "3,8,7,323"
Jetzt möchte ich...
SELECT name FROM tabelleA ta, tabelleB tb WHERE ta.id IN (tb.IDS)
Also gehen tuts schonmal, nur leider gibt er mir bloß den ersten Eintrag zurück, also den mit ID 3.
Ich könnte auch das Feld IDS mit PHP auslesen und dann eine neue SQL-Query zusammenbasteln, aber ich würde gern das alles über die eine SQL-Abfrage machen. Gibt es da evtl. noch andere Wege? Die IDs sollen in einem Feld stehen
Freu mich auf Ratschläge.
Seite 1 von 1
Mysql ... Where Field In (field) ? geht sowas?
#1
geschrieben 08. April 2010 - 20:47
Zitat
"In der Welt des Erkennbaren ist die Idee des Guten die höchste." - Platon
Spritify! Easy CSS-Sprite-Generator | Albanisch Deutsch Wörterbuch
Anzeige
#2
geschrieben 08. April 2010 - 21:06
Wenn Du jedem Eintrag ne ID zugwiesen hast, dann ist die SELECT abfrage schon der richtige Weg...
Da es sich um eine Mehrfachabfrage handelt, wäre es aber schon sinnvoll, dies über ein PHP-Script zu realisieren.
Sinnvoll wäre es hier vielleicht mit einer IF-Abfrage über PHP zu arbeiten...
Da es sich um eine Mehrfachabfrage handelt, wäre es aber schon sinnvoll, dies über ein PHP-Script zu realisieren.
Sinnvoll wäre es hier vielleicht mit einer IF-Abfrage über PHP zu arbeiten...
BORN STUPID? TRY AGAIN!
"Himmlische Ruhe und tödliche Stille haben dieselbe Phonzahl."
My Music
"Himmlische Ruhe und tödliche Stille haben dieselbe Phonzahl."
My Music
#3
geschrieben 08. April 2010 - 21:11
Wie es mit PHP funktioniert, das weiss ich. Die Herausforderung ist das nur per SQL zu lösen
Zitat
"In der Welt des Erkennbaren ist die Idee des Guten die höchste." - Platon
Spritify! Easy CSS-Sprite-Generator | Albanisch Deutsch Wörterbuch
#4
geschrieben 09. April 2010 - 08:04
MySQL bietet selbst keine Split-Funktion. Du müsstest dir also eine eigene Stored procedure schreiben.
Oder du verwendest direkt ein ordentliches DBMS wie Postgre, das bietet entsprechende Funktionen.
Oder du verwendest direkt ein ordentliches DBMS wie Postgre, das bietet entsprechende Funktionen.
#5
geschrieben 09. April 2010 - 08:25
warum nicht so:
Tabelle B:
Tabelle C:
Tabelle B:
ID Name 1 berühmt
Tabelle C:
B.ID A.ID 1 3 1 7 1 8 1 323
Raise your glass if you are wrong
#6
geschrieben 09. April 2010 - 11:01
DELIMITER // DROP PROCEDURE IF EXISTS split_string // CREATE PROCEDURE split_string ( IN input TEXT , IN `delimiter` VARCHAR(10) ) SQL SECURITY INVOKER COMMENT 'Splits a supplied string using using the given delimiter, placing values in a temporary table' BEGIN DECLARE cur_position INT DEFAULT 1; DECLARE remainder TEXT; DECLARE cur_string VARCHAR(1000); DECLARE delimiter_length TINYINT UNSIGNED; DROP TEMPORARY TABLE IF EXISTS SplitValues; CREATE TEMPORARY TABLE SplitValues ( value VARCHAR(1000) NOT NULL PRIMARY KEY ) ENGINE=MyISAM; SET remainder = input; SET delimiter_length = CHAR_LENGTH(delimiter); WHILE CHAR_LENGTH(remainder) > 0 AND cur_position > 0 DO SET cur_position = INSTR(remainder, `delimiter`); IF cur_position = 0 THEN SET cur_string = remainder; ELSE SET cur_string = LEFT(remainder, cur_position - 1); END IF; IF TRIM(cur_string) != '' THEN INSERT INTO SplitValues VALUES (cur_string); END IF; SET remainder = SUBSTRING(remainder, cur_position + delimiter_length); END WHILE; END // DELIMITER;
Ich habe hier eine Prozedur gefunden, kann man diese auch in eine Funktion umwndeln?
@zwutz: Mich interessiert diese Lösung, da ich aus Übersichtlichkeitsgründen das brauche. Besser 20 Columns also 20 Referenztabellen.
Zitat
"In der Welt des Erkennbaren ist die Idee des Guten die höchste." - Platon
Spritify! Easy CSS-Sprite-Generator | Albanisch Deutsch Wörterbuch
#7
geschrieben 09. April 2010 - 11:21
Ach sorry, keine Stored procedure, sondern eine Funktion. Nur die liefert Werte zurück.
Hmm...das scheint ein nettes Gefrickel zu sein.
Ich habe zwar eine einfache Funktion gefunden, die beschränkt sich allerdings auf einen Rückgabewert. Das heißt, du müsstest darum noch eine Funktion schreiben, die alle Werte zurückliefert oder du passt diese entsprechend an.
Abgesehen davon ist zwutz' Vorschlag am elegantesten. Dadurch hast du keine 20 Spalten, aber 20 Zeilen und kannst direkt mit einem "where in" arbeiten. Und ob mehrere Werte in einer Zelle übersichtlicher sind, sei mal dahin gestellt. Jedenfalls ist es nicht mehr wirklich atomar und verstößt gegen die erste Normalform.
Hmm...das scheint ein nettes Gefrickel zu sein.
Ich habe zwar eine einfache Funktion gefunden, die beschränkt sich allerdings auf einen Rückgabewert. Das heißt, du müsstest darum noch eine Funktion schreiben, die alle Werte zurückliefert oder du passt diese entsprechend an.
Abgesehen davon ist zwutz' Vorschlag am elegantesten. Dadurch hast du keine 20 Spalten, aber 20 Zeilen und kannst direkt mit einem "where in" arbeiten. Und ob mehrere Werte in einer Zelle übersichtlicher sind, sei mal dahin gestellt. Jedenfalls ist es nicht mehr wirklich atomar und verstößt gegen die erste Normalform.
#8
geschrieben 09. April 2010 - 11:59
Zitat (K050V4: 09.04.2010, 12:01)
@zwutz: Mich interessiert diese Lösung, da ich aus Übersichtlichkeitsgründen das brauche. Besser 20 Columns also 20 Referenztabellen.
Und ich hab lieber alle Daten fein säuberlich getrennt und nicht alles in einer Tabelle
Du solltest genau wissen, warum du absichtlich die Normalformen brichst. Die sind nicht zum Spass an der Freude da, sondern erleichtern dir die Arbeit mit deinen Daten ungemein.
Selbst wenn du den SELECT zustandebringst. Bleibt noch UPDATE und DELETE übrig.
Lösch mal aus deinem bisherigen Ansatz einen Wert oder füg dafür einen neuen ein.
Und Referenztabellen sind doch was feines. Alles was zusammengehört schön an einem Fleck
Witi sagte:
zwutzs
na, wie bildet man den Genitiv bei auf s-Lauten endenden Worten?
Raise your glass if you are wrong
#9
geschrieben 09. April 2010 - 12:38
[off]Jaja...Zwutz' oder Zwutzens [/off]
#10
geschrieben 10. April 2010 - 12:47
@Witi @zwutz
Ich weiss, dass dies gegen die erste Normalform verstößt, aber darum geht es mir gar nicht. Mich interessiert nur der reine Algorithmus. In der Praxis kommt natürlich nur die erste Normalform zum Einsatz
Ich weiss, dass dies gegen die erste Normalform verstößt, aber darum geht es mir gar nicht. Mich interessiert nur der reine Algorithmus. In der Praxis kommt natürlich nur die erste Normalform zum Einsatz
Zitat
"In der Welt des Erkennbaren ist die Idee des Guten die höchste." - Platon
Spritify! Easy CSS-Sprite-Generator | Albanisch Deutsch Wörterbuch
- ← Regex. String Darf Nicht Mit Zeichen X Anfangen
- Skript/Web-Programmierung
- [css] Tabellendarstellung, Fexibel →
Thema verteilen:
Seite 1 von 1