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`

カウントごとに1つの行とフィールドを持つ結果セットが作成されます。

于 2012-06-22T08:28:46.410 に答える
0

これ以上の情報がなければ一般化することは不可能ですが、ここで役立つ多くの構成要素があります。


まず、あなたの例は実際には2つではなく、1つのテーブルからのものです。これは、次のことができることを意味します...

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 に答える