2016-07-07 17 views
2

Ich habe diese Tabellen:MySQL Wie kann ich eine bessere Abfrage erstellen, um zwei Tabellen über meine Bridge-Tabelle zu verbinden?

Worte:

+----+------+ 
| ID | DATA | 
+----+------+ 
| 1 | jo | 
| 2 | yes | 
| 3 | jupp | 
| 4 | yeah | 
| 5 | jepp | 
| 6 | joah | 
| 7 | ne | 
| 8 | nee | 
| 9 | no | 
| 10 | nope | 
| 11 | nah | 
+----+------+ 

Aussagen:

+----+------+ 
| ID | DATA | 
+----+------+ 
| 1 | ja | 
| 2 | nein | 
+----+------+ 

und eine Brücke Tabelle, die die Worte aus der Tabelle „Worten“ mit den Daten aus der Tabelle „Aussagen“ verbindet :

Brücke:

+--------------+---------+ 
| ID_statement | ID_word | 
+--------------+---------+ 
|   1 |  1 | 
|   1 |  2 | 
|   1 |  3 | 
|   1 |  4 | 
|   1 |  6 | 
|   2 |  8 | 
|   2 |  9 | 
+--------------+---------+ 

Ich wollte eine SELECT-Abfrage erhalten, um alle Wörter mit der Aussage "ja" verbunden zu bekommen.

diese Abfrage macht den Job, aber es scheint komplizierter als es sein sollte:

SELECT words.DATA FROM words 
JOIN bridge ON words.ID = bridge.ID_word 
JOIN statements ON statements.ID = bridge.ID_statement 
WHERE statements.ID = (
SELECT ID FROM statements WHERE statements.DATA = "ja" 
); 

Intuition sagt mir, dass ich so weit zu comlicated tue, aber ich kann nicht herausfinden, wo die Komplikationsrate liegt. umständlich.

+0

eine andere Frage, aber etwas abseits des Themas wäre: wie würde man die Beziehung hier beschreiben? Eins zu viele? die Beziehung zwischen Worten und Aussagen scheint eins zu viele zu sein (nur eine Aussage passt zu vielen Wörtern, die Synonyme sein können). Das einzige ist, dass ich im Kontext von Viele-zu-Viele-Beziehungen nur über Bridge-Tabellen gelernt habe. ist mein DB-Design auf diese Weise fehlerhaft? – gauguerilla

Antwort

1

Ich mag die Primärschlüssel die gleichen wie die Spalten, die sie verweisen. In Ihrem Beispiel in der Tabelle words würden Sie den Primärschlüssel ID_word nennen. In der statements Tabelle würden Sie den Primärschlüssel ID_statement nennen.

Der Vorteil ist, dass Sie Ihren SQL-Beitritt ein wenig prägnanter mit der USING(...) Syntax machen können. Diese Syntax geht davon aus, dass in beiden Tabellen eines Joins eine Spalte mit diesem Namen vorhanden ist, und Sie möchten, dass der Join übereinstimmt, wenn die Spalte der gleichen Spalte in der anderen Tabelle entspricht.

Sie müssen auch keine Unterabfrage in Ihrem Beispiel ausführen. Die Zeilen in der Anweisung stimmen mit den IDs der Zeilen in der Anweisung überein, wobei DATA='ja' derselbe Satz wie die Zeilen in der Anweisung DATA='ja' sind.

Wie würde man die Beziehung hier beschreiben? Eins zu viele?

die Beziehung durch eine Brückentabelle modelliert ist eine many-to-many Beziehung. Die spezifischen Daten in Ihrem Beispiel zeigen es nicht, aber es ist möglich, dass viele verschiedene Anweisungen dasselbe Wort referenzieren können. Was Sie zeigen, ist, dass jede Aussage viele Wörter referenzieren kann.

+0

thx. das hat mir sehr geholfen und mein Leben wirklich erleichtert. Ich habe nie die USING-Syntax. über die Beziehung-Benennung: Also bedeutet das, dass Sie nur die Beziehungen der Tabelle und nicht die Beziehungen der Daten beschreiben würden? Oder würde es sich ändern, wenn ich ID_Wörter in der Bridge-Tabelle als Primärschlüssel definieren würde (was meine Beispieldaten bisher erlauben würden)? – gauguerilla

+1

@gauguerilla: Wenn eine Zeile in 'words' mit höchstens einer Zeile' statement' verknüpft werden kann, ist dies eine Eins-zu-viele-Beziehung, und eine "bridge" -Tabelle ist nicht notwendig.Sie könnten stattdessen eine Fremdschlüsselspalte/-beschränkung zu der Tabelle "words" hinzufügen, die auf den Primärschlüssel der Tabelle "statements" verweist. Wenn eine Zeile in 'words' nicht mit einer Zeile in' statements' verknüpft ist, weisen Sie der Fremdschlüsselspalte einen NULL-Wert zu. Dieser Entwurf würde die Beispieldaten erfüllen. Aber wie Bill bemerkte, können wir nicht feststellen, dass dies eine Eins-zu-Viele-Beziehung ist. (Das Fehlen eines Gegenbeispiels ist nicht ausreichend.) – spencer7593

+0

Was @ Spencer7593 sagte. –