2009-12-13 7 views
0

espérons vraiment que quelqu'un peut m'aider sur celui-ci! J'ai 6 tables:Requête compliquée - aide NÉCESSAIRE!

Produits
PRODID

Prodequipment
PRODID
equipclassmain
equipclassor

Equipclasses
classid

Equipfunctions
equipid
CLASSID

Équipement
equipid

Workshopequipment
workshopid
equipid

Produits - une liste de certains produits
Équipement - une liste de certains équipements
Prodequipment - liste quel équipement est nécessaire pour faire un produit. Vous pouvez utiliser les équipements listés dans equipclassmain ou les remplacer par des équipements dans equipclassor. Table Products a un à plusieurs rapports avec Prodequipment table, c'est-à-dire que vous utiliserez beaucoup d'outils différents (équipement) pour produire un produit, mais vous pouvez choisir d'utiliser n'importe qui dans la paire equipclassmain/equipclassor. Par exemple, pour encadrer une photo, vous pouvez utiliser un cadre en bois ou un cadre en plastique (une paire) et un couvercle en verre ou en plastique (deuxième paire). Vous pouvez le combiner comme vous le souhaitez, mais les deux paires doivent être utilisées: cadre en bois avec couvercle en verre ou cadre en plastique avec couvercle en verre ou cadre en bois avec couvercle en plastique ou en plastique avec couvercle en plastique.
Equipfunctions et Equipclasses - Comme un équipement peut être utilisé de différentes manières, il n'est pas directement lié à la table Prodequipment. J'ai créé des Equipclasses de table où toutes les utilisations uniques de tous les équipements possibles sont répertoriées et des Equipfunctions de table où j'énumère ces utilisations uniques pour chaque équipement.
Workshopequipment - répertorie les ateliers et les équipements qu'ils utilisent. Maintenant j'ai besoin d'une liste de produits qui peuvent être fabriqués par deux ateliers différents (disons workshopid = 1 et workshopid = 4), c'est-à-dire que ces deux ateliers ont tout l'équipement nécessaire pour produire ces produits. Gardez à l'esprit que ces ateliers n'ont pas besoin d'utiliser le même équipement pour le faire comme je l'ai décrit ci-dessus.

J'essaie avec cette requête:

SELECT prodid FROM Products JOIN (
    SELECT workshopid, prodlist, equipclassmain, equipclassor, 
     if(LOCATE(equipclassmain, prodlist) >0 
      AND LOCATE(equipclassor, prodlist) >0, 1, 0) AS pairstatus FROM Prodequipment JOIN 
    (
     SELECT classid FROM Equipclasses JOIN (
      SELECT classid FROM Equipfunctions JOIN (
       SELECT workshopid, GROUP_CONCAT(equipid) AS prodlist FROM Workshopequipment 
        GROUP BY workshopid 
      ) 
      equipfunclist GROUP BY equipid 
     ) equipclasslist GROUP BY classid 
    ) WorkshopequipmentList HAVING pairstatus = 1 AND workshopid in (1, 4) 
) prodbyworkshops ON classid = equipclassmain OR classid = equipclassor 

Mais j'obtenir une « colonne classid dans la liste des champs est ambigu ». Une idée de ce qui ne va pas ici?

MERCI!

Répondre

8

Votre requête référence plusieurs tables qui ont une colonne classid.
Par conséquent, lorsque vous référencez classid dans la clause HAVING, il ne sait pas quelle table obtenir le classid pour.

Vous devez écrire tablename.classidtablename est le nom de la table contenant la colonne classid. (Probablement equipclasslist, je ne regarde pas la requête)

1

Il est de la partie de la requête avec:

... 
SELECT classid 
FROM Equipclasses JOIN (
    SELECT classid 
    FROM Equipfunctions... 

Les deux EquipClasses et la requête interne ont un identificateur de classe. Vous devez spécifier ce que vous sélectionnez.