1

在庫合計を合計し、各在庫品目の最終更新日を表示するために使用しているクエリが 1 つあります。2 つの異なる在庫タイプ 0 と 1 (入庫、出庫) があります。ページの下部に「最終入荷在庫:」と「最終出荷日:」を表示できるようにしたいと考えています。

インベントリをグループ化して合計するためのメイン クエリの内容は次のとおりです。

 $query = "Select * 
          FROM (SELECT id, type, color, product, 
                      SUM(Quantity) AS TotalQuantity, MAX(Date) AS LatestDate 
                FROM inventory 
                GROUP BY id, color, type) AS alias 
          WHERE TotalQuantity > 0"; 

ここで、これら 2 つのクエリを実行して、「在庫」0 と 1 (着信、発信) の最終更新時刻を取得できるようにしたいと考えています。

$query = "SELECT MAX(Date) FROM inventory WHERE stock = 0";

$query = "SELECT MAX(Date) FROM inventory WHERE stock = 1";

これらの 3 つのクエリを組み合わせる方法はありますか? 私はUNIONを試していましたが、あまり運がありませんでした。

4

5 に答える 5

3

このようなことを試してください:

SELECT  alias.*,
    zeroStock.zeroDate,
    nonzeroStock.nonzeroDate
FROM
    (
        SELECT  id, 
            type, 
            color, 
            product, 
            SUM(Quantity) AS TotalQuantity, 
            MAX(Date) AS LatestDate 
        FROM    inventory 
        GROUP BY id, color, type
    ) alias INNER JOIN
    (
        SELECT id, MAX(Date) zeroDate
        FROM inventory 
        WHERE stock = 0
        GROUP BY id
    ) zeroStock on alias.id = zeroStock.id
    INNER JOIN
    (
        SELECT id, MAX(Date) nonzeroDate
        FROM inventory 
        WHERE stock = 1
        GROUP BY id
    ) nonzeroStock on alias.id = nonzeroStock.id
WHERE alias.TotalQuantity > 0
于 2012-06-21T05:43:50.730 に答える
2

これを試してみてください

Select
  alias.id,
  alias.type,
  alias.color,
  alias.product,
  Stock0.S0,
  Stock1.S1
FROM (SELECT
        id,
        type,
        color,
        product,
        SUM(Quantity)  AS TotalQuantity,
        MAX(Date)      AS LatestDate
      FROM inventory
      GROUP BY id, color, type) AS alias
  left join (SELECT
               id,
               MAX(Date)         S0
             FROM inventory
             WHERE stock = 0) as Stock0
    on Stock0.id = alias.id
  left join (SELECT
               id,
               MAX(Date)         S1
             FROM inventory
             WHERE stock = 0) as Stock1
    on Stock1.id = alias.id
WHERE TotalQuantity > 0
于 2012-06-21T06:42:18.407 に答える
1

a を使用しCROSS JOINて、通常の select ステートメントの各行に日付を追加できます。

SELECT  *
FROM    (
          SELECT  *
          FROM    (
                    SELECT id, type, color, product, SUM(Quantity) AS TotalQuantity, MAX(Date) AS LatestDate 
                    FROM inventory 
                    GROUP BY 
                          id, color, type
                  ) AS alias 
          WHERE TotalQuantity > 0
        ) AS q
        CROSS JOIN (SELECT MAX(Date) AS MaxIncoming FROM Inventory WHERE stock = 0) AS r
        CROSS JOIN (SELECT MAX(Date) AS MaxOutgoing FROM Inventory WHERE stock = 1) AS s

Mysql クロス ジョイン

Cross Join は、Cartesian Product Join とも呼ばれます。SQL の Cross Join は、最初のテーブルの各行が 2 番目のテーブルの各行と結合された結果テーブルを返します。

編集

レコードについては、TotalQuantityHAVINGの句の代わりに句を使用してステートメントを簡素化できます。WHERE

SELECT  *
FROM    (
          SELECT  id, type, color, product, SUM(Quantity) AS TotalQuantity, MAX(Date) AS LatestDate 
          FROM    inventory 
          GROUP BY 
                  id, color, type
          HAVING
                  SUM(Quantity) > 0        
        ) AS q
        CROSS JOIN (SELECT MAX(Date) AS MaxIncoming FROM Inventory WHERE stock = 0) AS r
        CROSS JOIN (SELECT MAX(Date) AS MaxOutgoing FROM Inventory WHERE stock = 1) AS s        
于 2012-06-21T05:45:29.653 に答える
0
SELECT id, type, color, product, 
                  SUM(Quantity) AS TotalQuantity, MAX(Date) AS LatestDate, null AS stock 
            FROM inventory 
            GROUP BY id, color, type
HAVING TotalQuantity > 0

UNION ALL 

SELECT null, null, null, null, null, MAX(Date), stock 
FROM inventory WHERE stock IN (0,1) GROUP BY stock
于 2012-06-21T06:55:30.743 に答える
0

クエリ 1 とは別に、クエリ 2 と 3 を実行することをお勧めします。クエリ 2 と 3 は、複数列のリストではなく個々の値を取得することを目的としているため、クエリ 1 とは別の問題です。また、クエリ 1 で結果をフィルタリングしていますが、2 と 3 ではフィルタリングしていません。

確かに、CROSS JOINサブクエリを 2 回実行できますが、そうすると、DB とアプリケーションの間でさらに多くの不要なデータを転送することになります。2 つの列全体ではなく、2つののみを取得する必要があります(これは結果セットの残りの部分とは無関係であり、その非優雅さをさらに強調しています)。

さらに、このCROSS JOINアプローチでは、 の条件を満たす行が少なくとも 1 つ存在することを前提とSUM(Quantity) > 0しています。それらのどれも満たしていない場合はどうなりますか?...そして、最新の入出庫日もわかりません! 可能性は低いかもしれませんが、この使用例を考慮する必要があります。

そうは言っても、サブセレクトを避けるために最初のクエリを書き直すことができます。

SELECT 
    id,
    color,
    type,
    product,
    SUM(Quantity) AS TotalQuantity,
    MAX(Date) AS LatestDate
FROM 
    inventory 
GROUP BY 
    id, 
    color, 
    type
HAVING
    SUM(Quantity) > 0

集計関数内で条件付きチェックを使用して、クエリ 2 と 3 を組み合わせることができますMAX()

SELECT
    MAX(CASE WHEN stock = 0 THEN Date ELSE NULL END) AS s0_maxdate,
    MAX(CASE WHEN stock = 1 THEN Date ELSE NULL END) AS s1_maxdate
FROM
    inventory
于 2012-06-21T07:17:08.677 に答える