WinFuture-Forum.de: Mysql ... Where Field In (field) ? - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Mysql ... Where Field In (field) ? geht sowas?


#1 Mitglied ist offline   K050V4 

  • Gruppe: aktive Mitglieder
  • Beiträge: 788
  • Beigetreten: 13. August 04
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Stuttgart
  • Interessen:(X)HTML<br />CSS2+<br />PHP 4/5<br />MySQL 5<br />Symfony 1.2+<br />JavaScript / AJAX<br />jQuery<br />C++<br />C#<br />Java<br />...

geschrieben 08. April 2010 - 20:47

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. ;)

Zitat

"In der Welt des Erkennbaren ist die Idee des Guten die höchste." - Platon

Spritify! Easy CSS-Sprite-Generator | Albanisch Deutsch Wörterbuch
0

Anzeige



#2 Mitglied ist offline   Taxidriver05 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.609
  • Beigetreten: 14. Mai 09
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Schkopau - OT Ermlitz
  • Interessen:- Ausgehen,
    - Sport (am liebsten an der frischen Luft),
    - Musik (machen und hören),
    - Grafik- und Webdesign,
    - gut Essen,
    - an PCs basteln (für den schnellen Euro ;-)),
    uvm.

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...
BORN STUPID? TRY AGAIN!

"Himmlische Ruhe und tödliche Stille haben dieselbe Phonzahl."
My Music
0

#3 Mitglied ist offline   K050V4 

  • Gruppe: aktive Mitglieder
  • Beiträge: 788
  • Beigetreten: 13. August 04
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Stuttgart
  • Interessen:(X)HTML<br />CSS2+<br />PHP 4/5<br />MySQL 5<br />Symfony 1.2+<br />JavaScript / AJAX<br />jQuery<br />C++<br />C#<br />Java<br />...

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
0

#4 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

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. ;)
0

#5 Mitglied ist offline   zwutz 

  • Gruppe: aktive Mitglieder
  • Beiträge: 652
  • Beigetreten: 17. Juli 07
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 09. April 2010 - 08:25

warum nicht so:

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
0

#6 Mitglied ist offline   K050V4 

  • Gruppe: aktive Mitglieder
  • Beiträge: 788
  • Beigetreten: 13. August 04
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Stuttgart
  • Interessen:(X)HTML<br />CSS2+<br />PHP 4/5<br />MySQL 5<br />Symfony 1.2+<br />JavaScript / AJAX<br />jQuery<br />C++<br />C#<br />Java<br />...

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
0

#7 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

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.
0

#8 Mitglied ist offline   zwutz 

  • Gruppe: aktive Mitglieder
  • Beiträge: 652
  • Beigetreten: 17. Juli 07
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 09. April 2010 - 11:59

Beitrag anzeigenZitat (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? :angry:
Raise your glass if you are wrong
0

#9 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 09. April 2010 - 12:38

[off]Jaja...Zwutz' oder Zwutzens <_<[/off]
0

#10 Mitglied ist offline   K050V4 

  • Gruppe: aktive Mitglieder
  • Beiträge: 788
  • Beigetreten: 13. August 04
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Stuttgart
  • Interessen:(X)HTML<br />CSS2+<br />PHP 4/5<br />MySQL 5<br />Symfony 1.2+<br />JavaScript / AJAX<br />jQuery<br />C++<br />C#<br />Java<br />...

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 :)

Zitat

"In der Welt des Erkennbaren ist die Idee des Guten die höchste." - Platon

Spritify! Easy CSS-Sprite-Generator | Albanisch Deutsch Wörterbuch
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0