2017-10-20 26 views
0

Je suis bloquant avec cette affaire, il s'agit de rejoindre deux tables et de retourner multi enregistrement.MySQL joindre multi enregistrement par un champ

Supposons que j'ai deux tables comme ceci:

Table produit:

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

Tableau médias:

+----+-----------+------------------------------------------+ 
| 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 + 
+----+-----------+------------------------------------------+ 

J'ai essayé d'utiliser JOIN avec WHERE IN clause:

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); 

et d'autres JOIN clause, mais le résultat de retour est:

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

Ce que je veux est le résultat de retour ont 3 dossiers comme celui-ci:

+----+-----------+-----------+------------+-----------------------+ 
| 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 + 
+----+-----------+-----------+------------+-----------------------+ 

Est-ce que quelqu'un sait comment joindre la table comme ça?

+2

Corrigez votre schéma. Voir la normalisation. – Strawberry

+0

@Strawberry je comprends le schéma normal de image_id est 'int', et je peux faire plus de colonnes comme' image_id_2', 'image_id_3',' image_id_4'. Mais dans mon cas, j'ai besoin de changer la colonne 'image_id' en' VARCHAR' –

+1

Il est clair que vous ne comprenez pas. Mais ne désespérez pas. Les principes de base de la normalisation sont en fait assez faciles à saisir (j'ai réussi à le comprendre, après tout!). – Strawberry

Répondre

1

Pour obtenir ce que vous recherchez, vous devez modifier légèrement votre schéma de base de données, en supprimant les valeurs séparées par des virgules de la table de produits.

Vous pouvez ensuite utiliser une table de liens que vous pouvez ensuite interroger pour la jointure.

Produits

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

product_media Liens

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

Vous pouvez alors faire une requête qui vérifie la table des liens et renvoie le résultat de multiples ligne que vous recherchez.

par exemple.

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 

en utilisant à gauche pour rejoindre les médias retourner sans produits si vous le souhaitez

également comme mentionné par quelqu'un d'autre, jetez un oeil à la normalisation. Cela aide vraiment lors de la conception de vos bases de données, et vous pouvez choisir jusqu'où vous voulez aller avec.

+0

Oui, je comprends le cas modifier DB Schema.J'utilise ce type de DB pour mon site web, fonction Upload image multiple et je pense utiliser le champ media_id car VARCHAR est meilleur que INT, je veux dire groupe media dans "media_id, media_id, media_id" vaut mieux que de le séparer à 3 enregistrements –

+0

utiliser une liste séparée par des virgules, oui, mais vous trouverez également que l'indexation sur les ID et l'utilisation d'une table de liens vous donne des résultats plus rapides, votre jointure ne fonctionnera pas avec une liste séparée par des virgules. votre code ci-dessus. https://stackoverflow.com/questions/2346920/sql-select-speed-int-vs-varchar – WillHazell