2010-07-29 8 views
0

J'ai 5 tables.
Première products comme:Sélectionnez parmi 4 tables avec jointures et IN

id | country_ids | category_ids | users_ids 
1 | 1,4,6  | 4,5,6,70 | 5,6,9 
2 | 5,6,3  | 4,8,2,11 | 1,5,8 

Deuxième countries comme:

c_id | c_name 
1 | Åland Islands 
2 | Antarctica 
... 

Troisième categories comme:

cat_id | cat_name 
2 | Small 
4 | Large  
... 

Quatrième table users comme:

u_id | u_name 
1 | David 
2 | Mary  
... 

Et la cinquième table review (la structure de la table n'est pas importante, compter uniquement les identifiants).

et sql

 
    SELECT a.*, COUNT(b.comm_id) AS comm_count, c.*, d.*, e.* 
    FROM products AS a 
    LEFT JOIN comments AS b ON b.comm_prod_id = a.id AND b.comm_published = 1 
    LEFT JOIN countries AS c ON c.c_id IN (a.country_ids) 
    LEFT JOIN categories AS d ON d.c_id IN (a.category_ids) 
    LEFT JOIN users AS e ON e.c_id IN (a.users_ids) 
    /*WHERE published = 1*/ 
    GROUP BY id 
    ORDER BY id DESC 
    LIMIT 0, 5 

Mais ce retour de requête seule valeur première pour les tables jointes.

Comment puis-je obtenir ramer comme

1 | Åland Islands, Equador, Russia | Small, tiny, large, ... | Anna, John, Linda 

PS! Ou dois-je créer une relation de table pour chaque table? Qu'est-ce qui ne va pas?

Répondre

0

Utilisation GROUP_CONCAT():

SELECT 
    a.id, 
    GROUP_CONCAT(DISTINCT c_name) AS country_names, 
    GROUP_CONCAT(DISTINCT cat_name) AS cat_names, 
    GROUP_CONCAT(DISTINCT u_name) AS user_names, 
    COUNT(DISTINCT b.comm_id) AS comm_count 
FROM products AS a 
LEFT JOIN comments AS b ON b.comm_prod_id = a.id AND b.comm_published = 1 
LEFT JOIN countries AS c ON c.c_id IN (a.country_ids) 
LEFT JOIN categories AS d ON d.c_id IN (a.category_ids) 
LEFT JOIN users AS e ON e.c_id IN (a.users_ids) 
/*WHERE published = 1*/ 
GROUP BY id 
ORDER BY id DESC 
LIMIT 0, 5 

Mise à jour: homme Oh, vous avez séparé une virgule liste dans votre table. Ça craint.
Lisez à propos de la normalisation et créez des tables de relation avec la structure product_comments (product_id, comment_id), product_countries (product_id, country_id) et stockez chaque relation dans une ligne distincte.

Exemple de données:

product_countries 
product_id, country_id 
1, 1 
1, 4 
1, 6 
2, 5 
2, 6 
2, 3 
+0

est pas un travail :(En conséquence, j'ai vu qu'un seul résultat 'Åland Par ex Islands' au lieu' Åland, Equador, Russia' – Globulopolis

+0

Mise à jour ma réponse... – Naktibalda

Questions connexes