2017-10-20 2 views
0

Ich stecke mit diesem Fall, es ist über zwei Tabellen verbinden und Multi-Record zurückgeben.MySQL Join Multi-Datensatz von einem Feld

Nehmen wir an, dass ich habe zwei Tabellen wie folgt aus:

Tabelle Produkt:

+----+-----------+-----------+ 
| id | name | media_id | 
+----+-----------+-----------+ 
| 1 + product 1 + 32,33,34 + 
+----+-----------+-----------+ 
media_id(VARCHAR(50)) 

Tabelle Medien:

+----+-----------+------------------------------------------+ 
| id | name |     path     + 
+----+-----------+------------------------------------------+ 
| 31 + media 1 +  localhost://uploads/image/image_1 + 
+----+-----------+------------------------------------------+ 
| 32 + media 2 +  localhost://uploads/image/image_2 + 
+----+-----------+------------------------------------------+ 
| 33 + media 3 +  localhost://uploads/image/image_3 + 
+----+-----------+------------------------------------------+ 
| 34 + media 4 +  localhost://uploads/image/image_4 + 
+----+-----------+------------------------------------------+ 

I JOIN mit WHERE IN Klausel zu verwenden versucht:

SELECT 
m.id, 
m.name as media_name, 
p.name, 
p.media_id 

FROM 
media as m 
JOIN product as p 

on m.id in (p.media_id); 

und andere JOIN Klausel aber das Rückergebnis ist:

+----+-----------+-----------+------------+-------------------------+ 
| id | name | image_id | media_name +   path   + 
+----+-----------+-----------+------------+-------------------------+ 
| 1 + product 1 + 32,33,34 + media 2 + uploads/image/image_1 + 
+----+-----------+-----------+------------+-------------------------+ 

Was ich will, ist das Rückergebnis haben 3 Datensätze wie folgt aus:

+----+-----------+-----------+------------+-----------------------+ 
| id | name | image_id | media_name +   path   + 
+----+-----------+-----------+------------+-----------------------+ 
| 1 + product 1 +  32 + media 2 + uploads/image/image_2 + 
+----+-----------+-----------+------------+-----------------------+ 
| 2 + product 1 +  33 + media 3 + uploads/image/image_3 + 
+----+-----------+-----------+------------+-----------------------+ 
| 3 + product 1 +  34 + media 4 + uploads/image/image_4 + 
+----+-----------+-----------+------------+-----------------------+ 

Wer weiß, wie Tabelle wie folgt zu verbinden?

+2

Korrigieren Sie Ihr Schema. Siehe Normalisierung. – Strawberry

+0

@Strawberry Ich verstehe das normale Schema von image_id ist 'int', und ich kann mehr Spalten wie' image_id_2', 'image_id_3',' image_id_4' machen. Aber in meinem Fall muss ich die 'image_id' Spalte in' VARCHAR' ändern. –

+1

Es ist klar, dass du es nicht verstehst. Aber verzweifle nicht. Die Grundprinzipien der Normalisierung sind eigentlich ziemlich einfach zu verstehen (ich habe es immerhin verstanden!). – Strawberry

Antwort

1

Um zu erreichen, was Sie suchen, würde eine geringfügige Änderung an Ihrem DB-Schema erfordern, die kommagetrennten Werte aus der Produkttabelle entfernen.

Sie könnten dann eine Linktabelle verwenden, die Sie dann für den Join abfragen könnten.

Produkte

| id | name  | 
|----|-----------| 
| 1 | product 1 | 
| 2 | product 2 | 
| 3 | product 3 | 

product_media Weblinks

| id | product_id | media_id | 
|----|------------|----------| 
| 1 | 1   | 1  | 
| 2 | 1   | 2  | 
| 3 | 1   | 3  | 

Sie können dann eine Abfrage tun, dass die Links-Tabelle überprüft und gibt die mehrreihige Ergebnis die Sie suchen.

z.B.

SELECT 
m.id, 
m.name as media_name, 
p.name as product_name 
m.path 

FROM 
media as m 
LEFT JOIN product_media_links as pl on m.id = pl.media_id 
LEFT JOIN products as p on p.id = pl.product_id 

linken verbinden Medien ohne Produkte zurück, wenn Sie so wollen

Auch als von jemand anderem erwähnt, werfen Sie einen Blick auf die Normalisierung. Es hilft wirklich beim Entwerfen Ihrer Datenbanken, und Sie können wählen, wie weit Sie damit gehen wollen.

+0

Ja, ich verstehe den Fall ändern DB-Schema.Ich benutze diese Art von DB für meine Website, Funktion Upload Multi-Image und ich denke, verwenden Sie field media_id als VARCHAR ist besser als INT, ich meine Gruppenmedien in "media_id, media_id, media_id" ist besser als trennen Sie es auf 3 Datensätze –

+0

Sie können Verwenden Sie eine kommagetrennte Liste, ja, aber Sie werden auch feststellen, dass die Indizierung auf IDs und die Verwendung einer Linktabelle schnellere Ergebnisse liefert. Auch Ihre Verknüpfung funktioniert nicht mit einer durch Kommas getrennten Liste als String, was das ursprüngliche Problem war Dein Code oben. https://stackoverflow.com/questions/2346920/sql-select-speed-int-vs-varchar – WillHazell