Cosa c'è di sbagliato nel mio MySQL Query?
-
21-09-2019 - |
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.
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 ...