Domanda

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

Risultato deve essere

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

Come posso ottenere questo? La query sopra ritorno ERRORE: Operando dovrebbe contenere 1 colonna (s)

Questo per preparare rapporto per un progetto da tutte le tabelle che tornano attivi, inattivi, totali record dalla tabella. Se questo metodo è sbagliato, allora cosa devo utente? Qualche suggerimento.

È stato utile?

Soluzione

Subquery possono restituire una sola colonna. Si sia bisogno di fare più subquery, un join, o un concat buon mercato Hack (CONCAT_WS(',', SUM(IF(status = 'Active', 1,0)), SUM(IF(status = 'Inactive', 1,0))) in un unico sottoquery.

Altri suggerimenti

Come dice l'errore, si sta selezionando una sottoquery che restituisce due colonne.

SELECT (one_thing, another_thing) AS combined_thing

non esiste in SQL. Si dovrà mettere ogni sottoquery sulla propria:

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

Tuttavia, non c'è davvero alcun beneficio per fare tutto questo in una singola query. Molto più 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

quindi presentare tali risultati assieme a livello di applicazione. Una clausola WHERE è più veloce e può utilizzare gli indici corretti, che un'espressione calcolata come somma / IF non può.

ancora più semplice:

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

Come ha detto BipedalShark, le vostre domande dovrebbero avere 1 colonna e hanno 2 ora. Ma oltre a questo si dovrebbe pensare di utilizzare COUNT (*) e dove clausola. Così dovrebbe essere dovrebbe occupare in questo modo:

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

Con la layout della query come ho appena fatto in questione, diventa molto evidente che il tot_university alias, per esempio potrebbe essere associato a due colonne, che non è possibile ...

Oltre a questo errore di sintassi / logico, l'intera query sembra poco strutturato per produrre il risultato desiderato.

Sembra molto simile a compiti a casa, o di apprendimento auto assegnato, in modo da non rovinare con una query di ready-made, invece qui ci sono alcuni suggerimenti.

  • l'informazione proviene da due distinte tabelle non correlate, magari utilizzare UNION per ottenere risultati in una singola query (mentre in modo efficace l'esecuzione di due interrogazioni) (si dovrebbe quindi utilizzare una colonna in più con un testo come 'Univ', 'pubblico' a differenziare le due linee)
  • SUM (IF colonna = x, 1,0) è un buon trucco per contare valori particolari, senza dover fare un gruppo, essenzialmente "rotolare" i conteggi in un solo passo.
  • il concat () trucco è buono se il vostro obiettivo è esclusivamente sui risultati di tipo testuale, ad esempio per scrivere, così com'è, in un rapporto, in caso contrario, sarebbe preferibile mantenere i risultati in colonne separate, per l'ulteriore elaborazione , visualizzazione nelle tabelle ecc ...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top