2011-03-23 6 views
1

J'ai un problème avec MySQL Query: J'ai deux tables: - clustercategories - domainesCompliqué MySQL Query Problème

Maintenant, j'ai une requête SQL qui énumère tous les domaines d'une catégorie spécifique avec le nom de la catégorie - ceci est ma requête:

SELECT domains.*, clustercategories.clustercategoryname 
FROM (domains, clustercategories) 
WHERE ((clustercategories.id = 3 AND (domains.cluster1id = 3 OR domains.cluster2id = 3)) 
OR (clustercategories.id = 10 AND (domains.cluster1id = 10 OR domains.cluster2id = 10))) 
AND domains.status = '1' 
GROUP BY domains.name 
ORDER BY domains.name 

Le problème est maintenant, que j'ai aussi une troisième table « » où je subpages veux compter toutes les entrées d'un domaine spécifique avec status = « 1 » et je ne sais pas comment modifier ma requête pour travailler - J'ai essayé cette requête, mais je n'obtiens aucun résultat:

SELECT domains.*, clustercategories.clustercategoryname 
FROM (domains, clustercategories) 
WHERE ((clustercategories.id = 3 AND (domains.cluster1id = 3 OR domains.cluster2id = 3) AND (SELECT COUNT(*) AS total FROM subpages WHERE subpages.domainid = domains.id AND subpages.status = '1')) 
OR (clustercategories.id = 10 AND (domains.cluster1id = 10 OR domains.cluster2id = 10) AND (SELECT COUNT(*) AS total FROM subpages WHERE subpages.domainid = domains.id AND subpages.status = '1'))) 
AND domains.status = '1' 
GROUP BY domains.name 
ORDER BY domains.name 

Avez-vous des idées?

+0

Pourriez-vous poster des définitions de table? – Martijn

Répondre

1

Il me semble que votre première requête peut être réécrite comme celui-ci

SELECT d.* 
     , cc.clustercategoryname 
FROM domains d 
     INNER JOIN clustercategories cc 
      ON cc.id = d.cluster1id 
      OR cc.id = d.cluster2id 
WHERE cc.id IN (3, 10) 
     AND d.status = '1'           
GROUP BY 
     d.name 
ORDER BY 
     d.name 

ajoutant ainsi le nombre de sous-pages peut être fait comme ceci

SELECT d.* 
      , cc.clustercategoryname 
      , sp.total 
    FROM domains d 
      INNER JOIN clustercategories cc 
      ON cc.id = d.cluster1id 
       OR cc.id = d.cluster2id 
      LEFT OUTER JOIN (
      SELECT COUNT(*) AS total 
        , domainid 
      FROM subpages 
      WHERE subpages.status = '1' 
      GROUP BY 
        domainid 
     ) sp ON sp.domainid = d.domainid   
    WHERE cc.id IN (3, 10) 
      AND d.status = '1'           
    GROUP BY 
      d.name 
    ORDER BY 
      d.name 
+0

cette requête semble prometteuse, mais j'obtiens toujours l'erreur "Total des colonnes inconnues dans la liste des champs" - je veux dire que ça va, parce que total n'est pas disponible et doit seulement être un lien pour count (*) comme total - mais qu'est-ce qui ne va pas ici? – codeworxx

+0

ok, j'ai changé sp.total à sp. * Et total = COUNT (*) à COUNT (*) COMME total - maintenant tout fonctionne comme prévu! Merci beaucoup! Vous avez fait ma journée :) – codeworxx

+0

@codeworkxx - désolé, j'ai raté vos commentaires (été parti). Bien, vous l'avez fait fonctionner pour vous. J'ai modifié l'instruction pour modifier la syntaxe SQL Server à la syntaxe MySQL. –

2

Je pense que vous aurez envie de mettre votre sous-requête dans votre projection, comme ceci:

SELECT domains.*, clustercategories.clustercategoryname, 
(SELECT COUNT(*) FROM subpages WHERE subpages.domainid = domains.id AND subpages.status = '1') AS total 
FROM domains, clustercategories 
WHERE ((clustercategories.id = 3 AND (domains.cluster1id = 3 OR domains.cluster2id = 3)) 
OR (clustercategories.id = 10 AND (domains.cluster1id = 10 OR domains.cluster2id = 10))) 
AND domains.status = '1' 
GROUP BY domains.name 
ORDER BY domains.name