Vinzenz Mai: WHERE-Abfrage nach Zahlen (getrennt mit Komma oder Semikolon)

Beitrag lesen

Hallo,

Also: Ich habe zwei Tabellen in MySQL:

texte
ID | Text | Quelle

1  | abc  | 1
2  | def  | 2
3  | ghi  | 3

quellen
QID | Quellenname

1   | Amazon
2   | Ebay
3   | Rebuy

Wenn ich die jetzt mit meinem laienhaften Wissen verknüpfe, funktioniert das ganz gut.

$sql = "SELECT * FROM texte a, quelle q WHERE a.id = q.qid ORDER BY qid DESC";

  
Naja, explizite Joins sind einfach viel schöner und klarer:  
  
~~~sql
SELECT  
    *  
FROM  
    texte t            -- besserer Aliasname als "a"  
INNER JOIN  
    quellen q  
ON  
    a.Quelle = q.QID   -- ist vermutlich richtiger als Dein a.id :-)  
ORDER BY  
    qid DESC  
  

Ich hielt es für angebracht, das über zwei Tabellen zu lösen und bin, wie gesagt, noch im "Laien-Modus" :-). Sollte es dafür also eine bessere Lösung geben, bitte ich dies zu entschuldigen. Zurück zum Thema...

zwei Tabellen sind in dem Fall, dass es genau eine Quelle gibt, durchaus richtig.

Wie muss denn meine Abfrage aussehen, wenn sich meine Quelle auf 1;2 verändert, also mehr als eine Quelle angegeben ist...

wenn es zu jedem Text mehr als eine Quelle geben kann und jede Quelle mehr als einem Text zugeordnet werden kann, dann hast Du eine n:m-Beziehung und benötigst in den üblichen DBMS eine Verknüpfungstabelle. Es ist gar keine gute Idee, die Daten *nicht* atomar abzulegen.

texte
ID | Text |

1  | abc  |

2  | def  |

3  | ghi  |

text_quellen

id_text | id_quelle
-------------------
      1 |      1
      1 |      2
      2 |      1
      2 |      2
      2 |      3
      3 |      1
      3 |      3

Die Zuordnung von Texten und Quellen erhältst Du nun über zwei Joins:

  
SELECT  
    t.id,  
    t.text,  
    q.QID,  
    q.Quellenname  
FROM  
    texte t  
INNER JOIN  
    text_quellen tq  
ON  
    t.id = tq.id_text  
INNER JOIN  
    quellen q  
ON  
    tq.id_quelle = q.QID

Das ist die ultimative Lösung.

Lesetipps:
Einführung in Joins
Fortgeschrittene Jointechniken

Freundliche Grüße

Vinzenz