2012-06-22 2 views
0

J'essaie de faire une page de statistiques dans mon script PHP. afin de sélectionner le nombre de chaque table je besoin de plus de 30 requêtes comme celui-citable temporaire a un compte pour l'autre table

SELECT COUNT(order_id) as `uncompleted_orders` FROM `orders` WHERE `order_status` != 0 

puis je dois exécuter une autre requête comme ceci:

SELECT COUNT(order_id) as `completed_orders` FROM `orders` WHERE `order_status` = 1 

J'ai essayé cette approche, mais il ne fonctionne pas:

SELECT COUNT(order_id) as `uncompleted_orders` FROM `sd_orders` WHERE `order_status` != 4; 
SELECT COUNT(order_id) as `completed_orders` FROM `sd_orders` WHERE `order_status` = 4; 

Est-il possible de creat une nouvelle table de temp MySQL contient le nombre d'autres tableaux?

Répondre

0

Sans plus d'informations, il est impossible de généraliser, mais il y a beaucoup de constructions qui peuvent vous aider ici.


D'abord, votre exemple est en fait d'une table, et non deux. Cela signifie que vous pouvez faire ce qui suit ...

SELECT 
    COUNT(CASE WHEN order_status = 4 THEN order_id END) AS complete_orders, 
    COUNT(CASE WHEN order_status <> 4 THEN order_id END) AS incomplete_orders 
FROM 
    sd_orders 

Cela fonctionne parce que COUNT(<something>) ne comprend pas un NULLs dans les résultats. Et en n'incluant pas une clause ELSE, tout ce qui ne correspond pas renvoie NULL. Une autre façon d'atteindre le même résultat est SUM(CASE WHEN ? THEN 1 ELSE 0 END).


En second lieu, où vous avez fait plusieurs tables, vous pouvez combiner les résultats de plusieurs façons différentes ...

-- Where you want one value from each table... 
-------------------------------------------------------------------------------- 
SELECT 
    (SELECT COUNT(*) FROM table1 WHERE fieldx = ?) AS value1, 
    (SELECT COUNT(*) FROM table2 WHERE fieldy = ?) AS value2 


-- Where you want one row of values from each table... 
-------------------------------------------------------------------------------- 
SELECT 
    table1_summary.value1 AS table1_value1, 
    table1_summary.value2 AS table1_value2, 
    table2_summary.value1 AS table2_value1, 
    table2_summary.value2 AS table2_value2 
FROM 
(
    SELECT 
    COUNT(CASE WHEN fieldx = ? THEN id END) AS value1, 
    COUNT(CASE WHEN fieldx <> ? THEN id END) AS value2 
    FROM 
    table1 
) 
    AS table1_summary 
CROSS JOIN 
(
    SELECT 
    COUNT(CASE WHEN fieldy = ? THEN id END) AS value1, 
    COUNT(CASE WHEN fieldy <> ? THEN id END) AS value2 
    FROM 
    table2 
) 
    AS table2_summary 


-- Where you want many rows, but of the same fields, from each table... 
-------------------------------------------------------------------------------- 
SELECT 
    * 
FROM 
(
    SELECT 
    'Table1'         AS source_table, 
    fielda         AS some_grouping, 
    COUNT(CASE WHEN fieldx = ? THEN id END) AS value1, 
    COUNT(CASE WHEN fieldx <> ? THEN id END) AS value2 
    FROM 
    table1 
    GROUP BY 
    fielda 

    UNION ALL 

    SELECT 
    'Table2'         AS source_table, 
    fieldb         AS some_grouping, 
    COUNT(CASE WHEN fieldy = ? THEN id END) AS value1, 
    COUNT(CASE WHEN fieldy <> ? THEN id END) AS value2 
    FROM 
    table2 
    GROUP BY 
    fieldb 
) 
    AS summary 
ORDER BY 
    source_table, 
    some_grouping, 
    value1, 
    value2 


Comme vous pouvez le voir, il y a beaucoup des façons de le faire. Comment vous l'approcher totalement dépend de vos données et de vos besoins.

4

Vous pouvez essayer quelque chose comme ceci:

SELECT 
(
    SELECT COUNT(order_id) FROM `sd_orders` WHERE `order_status` != 4 
) as `uncompleted_orders`, 
(
    SELECT COUNT(order_id) FROM `sd_orders` WHERE `order_status` = 4 
) as `completed_orders` 

Vous aurez un jeu de résultats avec une ligne et un champ pour chaque chef d'accusation.

Questions connexes