MySQL: SELECT-Abfrage bei mehreren Werten in einer Spalte

Tuppie

Mitglied
Hallo, ich versuche mich gerade an meiner ersten datenbank und habe eine Spalte angelegt, die mehrere Namen beinhaltet (Teilnehmer an einer Sportveranstaltung). Ich habe die Namen in der Spalte mit Komma getrennt:
'Teilnehmer 1, Teilnehmer 2 usw'
Ich würde nun gerne mit einer SELECT-Abfrage nach einzelnen Teilnehmern suchen können, also in etwa so:
SELECT * FROM `veranstaltungen` WHERE Teilnehmer = 'Teilnehmer1'
Leider klappt das aber nicht. Warum? Das müsste sich doch umsetzen lassen. Es sollte auch reichen, nur einen Teilnamen (Vor- oder Nachname) einzugeben... Wie setze ich das um?
 

basti1012

Erfahrenes Mitglied
SELECT * FROM `veranstaltungen` WHERE Teilnehmer = 'Teilnehmer1'
Das würde klappen wenn du nur den einen Namen in der Spalte stehen hast.
Da du aber mehrer Namen in der Spalte hast solltest du mal nach LIKE goggeln.
REGEX könnte auch klappen , doch als Anfänger vieleicht etwas schwer.

Vieviele Datensätze hat deine Tabelle den ?
Falls es zb nur die eine wäre könntest du die Zeile einfach holen und mit Php explode() deine Spalte auseinander nehmen und durchsuchen.
 

Sprint

Erfahrenes Mitglied
Vielleicht wäre es auch eine Überlegung wert, ob du die Namen nicht in einzelnen Datensätzen ablegst. Und die Veranstaltungen in einer eigenen Tabelle. Dann könntest du auch zusätzliche Informationen den einzelnen Namen zuweisen, z.B. Zeiten oder Punkte.

Zum Anfang also z.B. eine Tabelle mit Namen und ID (laufende Nummer) der Veranstaltung und eine Tabelle mit Namen, Vornamen, Veranstaltung-ID und einer Teilnehmer-ID (ebenfalls laufende Nummer).

Und beschäftige dich auch mal mit der Normalisierung einer Datenbank. Das ist auch für Anfänger verständlich und es gibt genügend Beispiele dazu. Dann erhöht sich zwar vielleicht die Anzahl der Tabellen und Abfragen können umfangreicher werden, insgesamt aber tust du dich später mal viel leichter, wenn du Daten ändern oder abfragen willst.
 

Yaslaw

n/a
Moderator
Geh noch einen Schritt weiter als Sprint. Das ist ein Klassiker für 3 Tabellen, denn du hast unendlich Teilnehmer die jeweils an unendlich Veranstalltungen teilnehmen können
- Tabelle Personen, mit ID, Name, Vorname etc.
- Tabelle Veranstallungen, mit eigener ID, Name, Ort, Termin etc.
- Tabelle Teilnehmer, mit je iener Zeile mit der ID der Veranstalltung und der ID des Teilnehmers

Diese Lösung findest du auch in jedem Lehrbuch. Von Anfang an sauber auftrennen, damit verbaust du dir nichts. Deine Lösung ist Excel, nicht Datenbank. Du kannst es zwar so lösen wie basti1012 schreibt, jedoch wirst du in Zukunft immer Probleme haben.

Beispiel:
Code:
TBL_PERSONEN
PID | VORNAME | NACHNAME
  1 | Hans    | Muster
  2 | Lena    | Keller
  3 | Susi    | Müller

TBL_VERANSTALLTUNGEN
VID | EVENT_NAME
  1 | Frühlingsturnier
  2 | Spezialturnier

TBL_TEILNEHMER
PID | VID
  1 | 1
  2 | 1
  2 | 2
  3 | 2
SQL-ABfrage mt einem einfachen INNER JOIN
SQL:
SELECT 
    v.* 
FROM 
    TBL_VERANSTALLTUNGEN v,
    TBL_TEILNEHMER t,
    TBL_PERSONEN p
WHERE 
    p.NACHNAME = 'KELLER'
    AND t.PID = p.PID
    AND t.VID = v.VID
 

Tuppie

Mitglied
Das würde klappen wenn du nur den einen Namen in der Spalte stehen hast.
Da du aber mehrer Namen in der Spalte hast solltest du mal nach LIKE goggeln.
REGEX könnte auch klappen , doch als Anfänger vieleicht etwas schwer.

Vieviele Datensätze hat deine Tabelle den ?
Falls es zb nur die eine wäre könntest du die Zeile einfach holen und mit Php explode() deine Spalte auseinander nehmen und durchsuchen.
Meine Tabelle hat derzeit knapp 100 Datensätze, es werden aber sukzessive mehr...
Mitunter muss ich die Möglichkeit haben, auch an die 30 Teilnehmer pro Veranstaltung eintragen zu können, um dann in allen Datensätzen nach einem bestimmten Teilnehmer suchen zu können...
LIKE / REGEX sagt mir noch nichts, google ich aber mal, danke für den Hinweis!
 

basti1012

Erfahrenes Mitglied
Du solltest aber versuchen den Beitrag 2 oder 3 nachzukommen.
Es vereinfacht dir vieles.
Bedenke das eine LIKE suche nach "Anna", auch bei Hanna positiv ist (Krasses Beispiel).
Oder, alle Spalten holen und später mit explode zu bearbeiten macht bei mehreren 1000 Einträge eine Performance Probleme (Vielleicht auch ein Timeout).
REGEX in Datenbanken zu nutzen ist meiner Meinung nach nicht gerade was für Anfänger.
Ich habe das mal nach dein Beispiel versucht und nur in der Teilnehmer Spalte nach einem Namen gesucht, mit Ergebnissen die noch nicht zufriedenstellend sind.
REGEX in DB ist er was für Profis.

Hast du den die ,Möglichkeiten deine Tabellen wie in #2,#3 steht aufzubauen, oder sind die so vorgegeben und nicht mehr änderbar
 

Yaslaw

n/a
Moderator
Wie bast schreibt. Unbedingt aufteilen. Was du hast, ist Excel, aber KEINE DATENBANK. Eine Datenbank besteht aus mehreren zusammenhängenden Tabellen.
 

Tuppie

Mitglied
Lieber Foris,
ich danke Euch sehr für die guten Anregungen, mit denen ich mich in Unkenntnis der Materie noch in Ruhe befassen werde. An dieser Stelle: kennt Ihr hier einen guten Web- oder Buchtipp, man dem man sich diesbezüglich ordentlich einarbeiten kann?
LIEBEN DANK!
 

Tuppie

Mitglied
Geh noch einen Schritt weiter als Sprint. Das ist ein Klassiker für 3 Tabellen, denn du hast unendlich Teilnehmer die jeweils an unendlich Veranstalltungen teilnehmen können
- Tabelle Personen, mit ID, Name, Vorname etc.
- Tabelle Veranstallungen, mit eigener ID, Name, Ort, Termin etc.
- Tabelle Teilnehmer, mit je iener Zeile mit der ID der Veranstalltung und der ID des Teilnehmers

Diese Lösung findest du auch in jedem Lehrbuch. Von Anfang an sauber auftrennen, damit verbaust du dir nichts. Deine Lösung ist Excel, nicht Datenbank. Du kannst es zwar so lösen wie basti1012 schreibt, jedoch wirst du in Zukunft immer Probleme haben.

Beispiel:
Code:
TBL_PERSONEN
PID | VORNAME | NACHNAME
  1 | Hans    | Muster
  2 | Lena    | Keller
  3 | Susi    | Müller

TBL_VERANSTALLTUNGEN
VID | EVENT_NAME
  1 | Frühlingsturnier
  2 | Spezialturnier

TBL_TEILNEHMER
PID | VID
  1 | 1
  2 | 1
  2 | 2
  3 | 2
SQL-ABfrage mt einem einfachen INNER JOIN
SQL:
SELECT
    v.*
FROM
    TBL_VERANSTALLTUNGEN v,
    TBL_TEILNEHMER t,
    TBL_PERSONEN p
WHERE
    p.NACHNAME = 'KELLER'
    AND t.PID = p.PID
    AND t.VID = v.VID
Hallo Yaslaw,
ich verstehe, wie Du da meinst. Was mache ich aber dann, wenn z.B. der Veranstaltungsname ebenfalls aus zwei oder mehr Wörtern bestehen muss, z.B. "Karl Otto Gedächtnisturnier" oder ähnlich? Hier soll man ja hinsichtlich des Veranstaltungsnamens die Möglichkeit haben, nur nach "Karl" oder "Otto" zu suchen...???