1

同様のトピックをよく読んでいましたが、a)自分のシナリオに一致するものを見つけること、またはb)自分の状況に合う/調整する/tweekするのに十分な他の人を理解することはできません。

私はテーブルを持っています。重要なフィールドは次のとおりです。

+------+------+--------+--------+
| ID   | Name | Price  |Status  |
+------+------+--------+--------+
|    1 | Fred |   4.50 |        |
|    2 | Fred |   4.50 |        |
|    3 | Fred |   5.00 |        |
|    4 | John |   7.20 |        |
|    5 | John |   7.20 |        |
|    6 | John |   7.20 |        |
|    7 | Max  |   2.38 |        |
|    8 | Max  |   2.38 |        |
|    9 | Sam  |  21.00 |        |
+------+------+--------+--------+ 

IDは、レコードが1日を通して追加されるときに、自動インクリメントされる値です。NAMEは主キーフィールドであり、テーブル全体で1〜3回繰り返すことができます。各NAMEにはPRICE値があり、NAMEごとに同じである場合と同じでない場合があります。

以下に基づいて入力する必要のあるSTATUSフィールドもあります。これは、実際には私が固執している部分です。

各DISTINCT名に価格が1つだけ付けられている場合、ステータス='Y'。各DISTINCT名に複数の価格が付加されている場合、ステータス='N'。

上記の表を使用すると、IDの1、2、および3は「N」であり、4、5、6、7、8、および9は「Y」である必要があります。

これには、JOIN、GROUP、およびDISTINCTの何らかの形の組み合わせが含まれる可能性があると思いますが、SQLの正しい順序にそれを配置する方法に迷っています。

4

2 に答える 2

0

ステータス列を更新する場合は、次のようにします。

UPDATE mytable s 
SET status = (
    SELECT IF(COUNT(DISTINCT price)=1, 'Y', 'N') c 
    FROM   (
            SELECT * 
            FROM mytable
           ) s1 
    WHERE  s1.name = s.name 
    GROUP BY name
    );

技術的には、これは必要ありません。

     FROM (
            SELECT * 
            FROM mytable
           ) s1

ただし、更新しているテーブルから選択できないという mysql の制限があります。括弧で囲むことで、mysql に一時テーブルを強制的に作成させると、突然それが可能になります。

于 2012-06-25T17:44:18.950 に答える
0

Price名前ごとの個別の値の数を取得するGROUP BYには、Nameフィールドで a を使用する必要がありますが、グループ化されていないすべての名前を追加のフィールドとともに表示する必要があるため、名前でグループ化する節でStatus最初にサブセレクトを作成する必要がありますFROM名前に複数の価格値があるかどうかを判断します。

GROUP BY Nameサブセレクトでは、特定の名前ごとに個別のCOUNT(DISTINCT price)価格値の数をカウントします。キーワードがなければ、price が null でない行の数を単純にカウントします。DISTINCT

それに関連して、特定の名前に複数の異なる値がある場合はCASE式を使用Nして列に挿入し、そうでない場合は挿入します。StatusPriceY

副選択は ごとに 1 つの行のみを返すNameため、すべての名前のグループ化を解除するには、副選択Name= メイン テーブルのという条件で、その副選択を主テーブルに結合しNameます。

SELECT
    b.ID,
    b.Name,
    b.Price,
    a.Status
FROM
    (
        SELECT Name, CASE WHEN COUNT(DISTINCT Price) > 1 THEN 'N' ELSE 'Y' END AS Status
        FROM tbl
        GROUP BY Name
    ) a
INNER JOIN
    tbl b ON a.Name = b.Name

編集:更新を容易にするために、JOINsUPDATEなどを使用してこのクエリを組み込むことができます。

UPDATE 
    tbl a
INNER JOIN
    (
        SELECT Name, CASE WHEN COUNT(DISTINCT Price) > 1 THEN 'N' ELSE 'Y' END AS Status
        FROM tbl
        GROUP BY Name
    ) b ON a.Name = b.Name
SET 
    a.Status = b.Status

テーブルに空のStatus列があるとします。

于 2012-06-25T17:16:14.990 に答える