Question

SELECT
  ( SELECT
       SUM(IF(status = 'Active', 1, 0)) AS `univ_active`,
       SUM(IF(status = 'Inactive', 1, 0)) AS 'univ_inactive',
       Count(*)
    FROM online_university
  ) 
 AS tot_university,
( SELECT 
    SUM(IF(status = 'Active', 1,0)) AS `user_active`,
    SUM(IF(status = 'Inactive', 1,0)) AS 'user_inactive'
    Count(*)
  FROM online_register_user)
AS tot_users

Résultat doit être

univ_active=4 univ_inactive=2 tot_university=6
user_active=10 user_inactive=3 tot_users = 13

Comment puis-je obtenir? La requête ci-dessus retour ERROR: opérande doit contenir une colonne (s)

pour préparer un rapport pour un projet de toutes les tables de retour actifs, inactifs, Nombre total d'enregistrements de la table. Si cette méthode est erronée alors que dois-je l'utilisateur? Toute suggestion.

Était-ce utile?

La solution

Les sous-requêtes ne peuvent retourner une colonne. Soit vous devez faire plusieurs sous-requêtes, une jointure, ou un hôtel pas cher concat pirater (CONCAT_WS(',', SUM(IF(status = 'Active', 1,0)), SUM(IF(status = 'Inactive', 1,0))) dans un sous-requête.

Autres conseils

Comme l'erreur dit, vous êtes la sélection d'un sous-requête qui retourne deux colonnes.

SELECT (one_thing, another_thing) AS combined_thing

n'existe pas dans SQL. Vous devez mettre chaque sous-requête lui-même:

SELECT (
    SELECT SUM(IF(status='Active', 1, 0)) FROM online_university
) AS univ_active, (
    SELECT SUM(IF(status='Inactive', 1, 0)) FROM online_university
) AS univ_inactive, (
    SELECT SUM(IF(status='Active' OR status='Inactive', 1, 0)) FROM online_university
) AS tot_university, (
    SELECT SUM(IF(status='Active', 1, 0)) FROM online_register_user
) AS user_active, (
    -- and so on

Cependant, il n'y a vraiment aucun avantage à faire tout cela en une seule requête. Beaucoup plus facile à dire:

SELECT COUNT(*) FROM online_university WHERE status='Active';  -- univ_active
SELECT COUNT(*) FROM online_university WHERE status='Inactive';  -- univ_inactive
SELECT COUNT(*) FROM online_university;  -- tot_university
SELECT COUNT(*) FROM online_register_user WHERE status='Active';  -- user_active
    -- and so on

puis présenter ces résultats ainsi que dans la couche d'application. Une clause WHERE est plus rapide et peut utiliser des index appropriés qui une expression calculée comme SUM / IF ne peut pas.

encore plus simple:

SELECT status, COUNT(*) FROM online_university GROUP BY status;
SELECT status, COUNT(*) FROM online_register_user GROUP BY status;

Comme dit BipedalShark, vos requêtes doivent avoir une colonne et ils ont 2 maintenant. Mais, outre que vous devriez penser à utiliser count (*) et où la clause. Il doit donc être lissée comme ceci:

select
 (select count(*) from online_university where status = 'Active') as univ_active,
 (select count(*) from online_university where status = 'Inactive') as univ_inactive,
 (select count(*) from online_register_user where status = 'Active') as user_active,
 (select count(*) from online_register_user where status = 'Active') as user_inactive

Par la mise en page de la requête comme je viens à la question, il devient évident que le tot_university alias, par exemple serait associé à deux colonnes, ce qui est impossible ...

En dehors de cette erreur de syntaxe / logique, toute requête semble mal structurée pour produire le résultat souhaité.

Il ressemble beaucoup à leurs devoirs, ou auto-apprentissage affecté, je ne vais pas gâcher avec une requête ready-made, au lieu voici quelques conseils.

  • l'information provient de deux distincts, des tables non liées, peut-être utiliser UNION pour obtenir des résultats en une seule requête (vous (lors de l'exécution efficace deux requêtes), puis utiliser une colonne supplémentaire avec un texte comme « Univ », « public » à différencier les deux lignes)
  • SUM (IF colonne = x, 1,0) est une bonne astuce pour compter des valeurs particulières, sans avoir à faire un groupe par, essentiellement « rouler » les comptes en une seule étape.
  • le concat () truc est bon si votre accent est mis exclusivement sur les résultats de type textuel, par exemple pour écrire, en l'état, dans un rapport, sinon, il serait préférable de garder les résultats dans des colonnes distinctes, pour un traitement ultérieur , affichage dans les tableaux, etc ...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top