2010-10-01 5 views
0

Peut-on utiliser SQL pour trouver toutes les marques qui ont les catégories les plus courantes? Par exemple, la marque "Dove" peut avoir une catégorie de savon, soins de la peau, shampooing Il est de trouver toutes les marques qui a les catégories les plus correspondantes, en d'autres termes, les marques les plus similaires. Cela peut être fait par programmation en utilisant Ruby ou PHP: il suffit de prendre une marque, et de passer en revue toutes les autres marques, et de voir combien de catégories correspondent et de les trier. Mais s'il y a 2000 marques, il faut alors 2000 requêtes par marque. (sauf si nous pré-cache tous les résultats de la requête 2000, donc pour toutes les marques 2000, nous réutilisons ces résultats)Est-ce que les articles avec les descendants les plus communs peuvent être trouvés en utilisant SQL/MySQL?

Peut-il être fait par SQL/MySQL par 1 requête?

Say, la table a:

entities 
-------- 
id 
type = brand or category or product 
name 


entities_parent_child 
-------------------- 
parent_id 
child_id 

le tableau ci-dessus a une entrée pour chaque parent = marque et de l'enfant = produit, et aussi une entrée pour chaque parent = catégorie et enfant = produit, si la marque a se rapporter à la catégorie par produits.

Je pense que la partie la plus difficile pour SQL est la suivante: trouvez tous les nombres de correspondance maximum et effectuez le tri par ces nombres.

+0

Il s'agit d'une mauvaise conception de base de données - ce que vous décrivez n'est pas une véritable relation parent/enfant, où vous pouvez avoir un nombre indéfini de parents/enfants. Il est pratiquement toujours mauvais de créer quelque chose d'aussi générique qu'une table 'entities'. – wuputah

+1

Le principal problème est que MySQL n'a pas de support de requête hiérarchique. –

+0

@wuputah Je pense que la base de données contenait à l'origine uniquement des produits, catégories et marques. Mais les stocker dans la table des entités peut réutiliser certaines fonctions communes et les avoir comme polymorphes en termes de relation parent/enfant dans un arbre. Mais que se passe-t-il s'ils sont dans 3 tables séparées, est-il possible de trouver des marques similaires en utilisant 1 instruction SQL (ou quelques-unes)? –

Répondre

0

Je suis d'accord avec le commentaire de wuputah. Pour ce problème, une table "entities" n'est pas la réponse. Vous avez donné un indice que la conception est incorrecte lorsque vous dites que vous ne pouvez pas créer une requête pour obtenir les réponses souhaitées.

Créer une hiérarchie appropriée pour vos données, avec des tables séparées pour les entités de mots réels distincts, le vôtre sera:

[Brands] 
[Categories] 
[Products] 

Si vous avez besoin d'aide avec la définition des arbres et des hiérarchies dans SQL, je vous suggère de choisir une copie de Trees and Hierarchies in SQL for Smarties de Celko.

SQL n'a pas de concept de polymorphisme, n'essayez donc pas de concevoir votre base de données en fonction de votre langage de programmation. Les bases de données fonctionnent avec des ensembles, donc pensez en ensembles.

Pour trouver des marques similaires se joindre à vos tables et regroupement d'utilisation:

SELECT Brands.brand_name, COUNT(Categores.category_name) as category_count 
FROM Brands INNER JOIN Categories 
ON Brands.brand_name = Categories.brand_name 
GROUP BY Brands.brand_name 
ORDER BY Brands.brand_name, COUNT(Categores.category_name) -- add DESC if you want largest count at the top 

Cela vous donne l'idée de base, si vous pouvez étendre sur l'exigence:

... trouver tout le maximum correspondant à compte, et trier ces chiffres

Ensuite, je peux aider à restructurer la requête et, le cas échéant, la conception du schéma.

+0

N'est-il pas vrai que vous pouvez toujours remplacer la table Product par la table entity, mais utilisez simplement select ... from ... entity comme p ... où entity_type = "Product" 'au lieu de' select ... from ... produit comme p'? –

+0

Dans certaines petites bases de données, vous pouvez utiliser les tables EAV avec succès, mais dans votre cas, pourquoi voulez-vous? Vous avez des entités distinctes (Marques, Catégories et Produits) alors pourquoi ne pas les mettre dans leurs propres tables? Le modèle d'entité signifie que vous ne pouvez pas appliquer l'intégrité des données et que vous finissez par vous joindre à la table plusieurs fois, ce qui réduit les performances. Jetez un oeil à cet article intéressant: http://weblogs.sqlteam.com/davidm/articles/12117.aspx – Tony

Questions connexes