0

我正在尝试在我的 php 脚本中创建一个统计页面。为了从每个表中选择计数,我需要 30 多个这样的查询

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

然后我需要像这样运行另一个查询:

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

我试过这种方法,但没有奏效:

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;

有什么方法可以在 MySQL 中创建一个新的临时表,其中包含其他表的计数?

4

2 回答 2

4

你可以尝试这样的事情:

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`

您将获得一个结果集,其中包含一行和每个计数的字段。

于 2012-06-22T08:28:46.410 回答
0

如果没有更多信息,就不可能一概而论,但这里有许多可以帮助您的结构。


首先,您的示例实际上来自一个表,而不是两个表。这意味着您可以执行以下操作...

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

这是有效的,因为COUNT(<something>)结果中不包含 NULL。如果不包含ELSE子句,任何不匹配的内容都会返回 NULL。人们实现相同结果的另一种方法是SUM(CASE WHEN ? THEN 1 ELSE 0 END).


其次,您实际上有多个表,您可以通过几种不同的方式组合结果......

-- 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


如您所见,有很多方法可以做到这一点。如何处理它完全取决于您的数据和您的需求。

于 2012-06-22T09:51:46.990 回答