Compter plusieurs colonnes avec le groupe par dans une requête

je compte les valeurs de plusieurs colonnes comme ceci:

SELECT COUNT(column1),column1 FROM table GROUP BY column1
SELECT COUNT(column2),column2 FROM table GROUP BY column2
SELECT COUNT(column3),column3 FROM table GROUP BY column3

ceci retourne par exemple pour le tableau column1(attr1 => 2000, attr2 => 3000...) (Chaque colonne a des valeurs spécifiques et peu nombreuses). Le problème est que "table" dans mon application peut être une requête avec quelques jointures et où les clauses, qui peuvent prendre 0,1 seconde. En faisant tout ce qui compte "table" est calculé à chaque fois encore ce qui n'est pas nécessaire. Est-il possible de prendre les résultats que je veux avec une requête, ou "cache" de la requête qui produit table? Sinon, je pense que la dénormalisation serait la seule solution. Et je veux les mêmes résultats avec les requêtes. J'utilise mysql-myisam.

29
demandé sur yAnTar 2012-10-02 19:12:33

5 réponses

il est difficile de savoir comment vous aider sans comprendre le contexte / structure de vos données, mais je crois que cela pourrait vous aider:

SELECT 
     SUM(CASE WHEN column1 IS NOT NULL THEN 1 ELSE 0 END) AS column1_count
    ,SUM(CASE WHEN column2 IS NOT NULL THEN 1 ELSE 0 END) AS column2_count
    ,SUM(CASE WHEN column3 IS NOT NULL THEN 1 ELSE 0 END) AS column3_count
FROM table
38
répondu coge.soft 2012-11-02 15:26:20

Une solution est de l'envelopper dans une sous-requête

SELECT *
FROM
(
    SELECT COUNT(column1),column1 FROM table GROUP BY column1
    UNION ALL
    SELECT COUNT(column2),column2 FROM table GROUP BY column2
    UNION ALL
    SELECT COUNT(column3),column3 FROM table GROUP BY column3
) s
7
répondu John Woo 2012-10-02 15:15:04
select tab1.name,
count(distinct tab2.id) as tab2_record_count
count(distinct tab3.id) as tab3_record_count
count(distinct tab4.id) as tab4_record_count
from tab1
left join tab2 on tab2.tab1_id = tab1.id
left join tab3 on tab3.tab1_id = tab1.id
left join tab4 on tab4.tab1_id = tab1.id
3
répondu Rajesh Paul 2015-07-03 06:38:03

Vous n'avez pas dit quel serveur de base de données vous utilisez, mais si les tables temp sont disponibles, elles peuvent être la meilleure approche.

// table is a temp table
select ... into #table ....
SELECT COUNT(column1),column1 FROM #table GROUP BY column1  
SELECT COUNT(column2),column2 FROM #table GROUP BY column2  
SELECT COUNT(column3),column3 FROM #table GROUP BY column3  
// drop may not be required
drop table #table
1
répondu Miserable Variable 2012-10-02 15:18:16
    SELECT SUM(Output.count),Output.attr 
FROM
(
    SELECT COUNT(column1  ) AS count,column1 AS attr FROM tab1 GROUP BY column1 
    UNION ALL
    SELECT COUNT(column2) AS count,column2 AS attr FROM tab1 GROUP BY column2
    UNION ALL
    SELECT COUNT(column3) AS count,column3 AS attr FROM tab1 GROUP BY column3) AS Output

    GROUP BY attr 
0
répondu Mohsen Bandamir 2016-10-05 08:12:19