Datensätze wo ID in einem "TEXT" - Field ist

maga147

Erfahrenes Mitglied
Hi,

sorry erstmal für den bescheuerten Titel, aber ich wusste nicht wie ich es treffender Formulieren kann:

Ich habe eine Tabelle A, in der ein paar Datensätze drin sind. Bei jedem Datensatz gibts ein per TEXT formatiertes Feld in dem verschiedene ID's mit leerzeichen drin stehen... also z.b.
1 2 3 4 [...] 11 12 usw....
So viel zu Tabelle A.

In Tabelle B hab ich ein paar Viele Datensätze drin, mit einer eindeutigen ID.
In A sind in den wenigen Datensätzen die IDs aus B drinnen, aber unsortiert.

Ich würde jetzt gerne die Datensätze aus A auslesen, in dem eine ID aus Tabelle B drin ist. Also wenn ich den Datensatz mit der ID 2 (B) auslese, sollen alle Datensätze aus A wo die ID 2 drin ist, rauskommen.......

Ich hoffe ihr habt es verstanden... wenn nicht kann ich es hoff ich noch genauer
erläutern.......

Vielleicht kann mir da irgendwer helfen, weil ich absolut nicht weiter komme :(

EDIT: Als Datenbank hab ich MySQL 4.1. i.V.m. PHP
 
Zuletzt bearbeitet:
Frage:

Hat Tabelle a ein Spalte ID und eine Spalte TEXT? Oder ist die Spalte Text auch die ID?
Ich hab es so verstanden, dass Deine Tabelle B in A alle TEXTE durchsuchen soll, ob ihre ID in einer Zelle vorkommt. (Sehr sehr ungewöhnlich, unperformant und sicherlich nicht gut überlegt, wenn es so ist)

So gehts:
Mach nen Select auf A mit einem Subselect auf B und nimm die ID für B mit einem LIKE in die Abfrage rein. Wenn man wirklich Deine Struktur kennen würde, wäre die Antowrt sicherlich qualitativ aussagekräftiger.

Chris
 
wenn ich Dich richtig verstanden haben - könnte es so funktionieren

PHP:
$suchid = select foo from B where suchbegriff = $var;

while ... $erg

$res = ( select * from A where id like %$erg(id)% )

while
 
Frage:

Hat Tabelle a ein Spalte ID und eine Spalte TEXT? Oder ist die Spalte Text auch die ID?
Ich hab es so verstanden, dass Deine Tabelle B in A alle TEXTE durchsuchen soll, ob ihre ID in einer Zelle vorkommt. (Sehr sehr ungewöhnlich, unperformant und sicherlich nicht gut überlegt, wenn es so ist)

Ja, das wär so... Tabelle A hat id und ne Spalte mit TEXT in denen die IDs aus B vorkommen.

Das ganze soll eine Art Gruppensystem sein, aber man kann eben auch in mehreren Gruppen sein, deswegen wollte ich jeden User (das ist Tabelle B) in Tabelle A per Text Feld eintragen.
Ich wollte mir also ne Zusätzliche Tabelle sparen, die einträge nach dem Prinzip:

id gruppe user
1 1 2
1 2 2
1 1 1

denn das ist meines erachtens nach performance schädigend wenn irgendwann mal ein paar tausend einträge drin sind.

Ich werde die SQL abfragen mal so probieren. Wenn du, chris, allerdings noch ne andere möglichkeit weist, die dir jetzt erst einfällt, kannste dich gerne melden :)
 
Hi,

wenn ich es richtig verstanden habe, dann brauchst du eine n:m Beziehung. Die ist relational nicht sauber einfach so abzubilden. Man benutzt deswegen eine Hilfstabelle:

Nur mal so als Psyeudocode:

Table_A
ID_A (PK)
Col1_A
Col2_A
usw.

Table_B
ID_B (PK)
Col1_B
Col2_B
usw.

Und nun kommt die Hilfstabelle für die n:m Darstellung:
Table_C
Col_ID_A
Col_ID_B

Hinweis:
Ein Primärschlüssel sollte IMMER künstlich vom System erzeugt sein. In MySQL hilft dir da der Autoindex.

Nun wie sieht das in der Realität aus:

Tabelle A
1 | Schmidt | Klaus
2 | Mayer | Tom
3 | Jäger | Anna

Tabelle B
1 | Macht Liebe | im Bett
2 | Sex | im Auto
3 | Kein Bock | Nirgendwo

Tabelle C
1 | 3
2 | 3
3 | 1

Was das gibt, darf jeder selbst herausfinden.

Code:
select Col1_B, Col2_B from Table_A inner join table_C on Col_ID_B=Col_ID_A  inner join table_A on table_C.Col_ID_A = table_A.Col_ID_B where table_A.Col1_A like '%TEXTPATTERN%'

Das SQL Statement gibt nur Ergebnisse zurück, wo wirklich in allen Tabellen ein Eintrag vorhanden sind. Sonst sollte man sich durchlesen, was ein LEFTJOIN ist.

Das hab ich jetzt aus dem Ärmel geschüttelt und es ist nicht getestet. So ist aber der sauberste weg. Obs der effizienteste ist, wüßt ich nur, wenn ich die Sachlage kenne.
Schau dir mal Infos zu Relationen und JOINS an. Da versteht man meist erst, was eine DB wirklich ist. Wenn Du die PK von der Tabelle A kennst, dann kann die Suche über das Textpattern entfallen. So ein LIKE über einen TEXT ist eh immer höchst unperformant.

Chris
 
Zuletzt bearbeitet:
Zurück