2009-05-14 10 views
0

Salut gars je suis mon dossier actif choisissais de mes domaines de table et tous mes autres dossier sont bien, mais l'enregistrement actif me donner des erreurs mon code estPourquoi MySQL donne-t-il une erreur "La sous-requête renvoie plus d'une ligne"?

@query = Estate.find_by_sql"SELECT (e.name) as estate_name, g.name as governing_body,"+ "(select count() from stands s where s.estate_id = e.id AND #{filter_estates}) as total_stands, "+ "(select e.active from estates e where e.active = true AND #{filter_estates}) as estate_status, "+ "(select count() from services sp where sp.estate_id = e.id AND #{filter_estates}) as service_providers,"+ "(select count(*) from approved_vendors av where av.estate_id = e.id AND #{filter_estates})as vendors"+ " FROM estates e LEFT JOIN governing_bodies g on e.governing_body_id = g.id AND #{filter_estates} "

et je reçois une erreur.

(Mysql::Error: Subquery returns more than 1 row: SELECT (e.name) as estate_name, g.name as governing_body,(select count() from stands s where s.estate_id = e.id AND e.id IS NOT NULL) as total_stands, (select e.active from estates e where e.active = true AND e.id IS NOT NULL) as estate_status, (select count() from services sp where sp.estate_id = e.id AND e.id IS NOT NULL) as service_providers,(select count(*) from approved_vendors av where av.estate_id = e.id AND e.id IS NOT NULL)as vendors FROM estates e LEFT JOIN governing_bodies g on e.governing_body_id = g.id AND e.id IS NOT NULL):

et je veux afficher tous les domaines qui sont actifs et inactifs.

s'il vous plaît les gars, comment puis-je résoudre ce problème. J'utilise la base de données Mysql.

Répondre

3

Il semble que vous pourriez avoir un problème avec votre troisième ligne:

(select e.active from estates e where e.active = true AND #{filter_estates}) as estate_status

Les lignes ci-dessus et au-dessous qui utilisent un agrégat, donc ils reviennent qu'une seule ligne, cela pourrait (est probablement) retourner plusieurs lignes et il ne sait pas lequel attribuer à estate_status.

Vous pourriez probablement changer cette ligne à:

e.active as estate_status

+0

Je me suis dérouté en écrivant ma réponse. ;) +1 – NotMe

+0

Merci, ce "(select e.active) comme état de la propriété" travaillé. bonne journée. –

1

Je ne suis certainement pas au courant de la table pour la meilleure réponse que je peux vous donner est en ce moment pourquoi cette requête ne fonctionne pas.

sélectionnez e.active de domaines où e e.active = true ET # {filter_estates}) comme estate_status

cette ligne retourne plus d'une ligne, que vous ne pouvez pas y faire. Notez que vos autres utilisateurs utilisent des fonctions aggegrate pour ne renvoyer qu'une ligne.

Oh, je ne pas utiliser mon SQL beaucoup, mais dans T-SQL que nous faisons souvent des choses comme max (e.active) ou peut-être mettre un top 1 (qui je pense est limite 1 dans mon sQL)

+0

J'aime votre réponse :) –

0

Votre sous-requête

(SELECT e.active FROM estates e WHERE ...) AS estate_status 

renvoie plus d'une valeur.

Si vous le pouvez, utilisez 'TOP 1' comme:

SELECT e.name AS estate_name , 
     g.name AS governing_body, 
     (SELECT COUNT(*) FROM stands s   WHERE ...) AS total_stands, 
     (SELECT TOP 1 e.active FROM estates e  WHERE ...) AS estate_status, 
     (SELECT COUNT(*) FROM services sp   WHERE ...) AS service_providers, 
     (SELECT COUNT(*) FROM approved_vendors av WHERE ...) AS vendors 
FROM estates e 
LEFT 
JOIN governing_bodies g ON e.governing_body_id = g.id 
          AND ... 
0

Une sous-requête dans la clause SELECT doit revenir à 1 ligne et 1 colonne à non ambigu. Cette pièce produit plus de 1 rang:

"(select e.active from estates e where e.active = true AND #{filter_estates}) as estate_status 

changement à

"(select first(e.active) from estates e where e.active = true AND #{filter_estates}) as estate_status 
Questions connexes