0

把握できない問題があり、頭がおかしくなっています。

変数を使用して値の一部を再フォーマットするサブクエリでクエリを実行しています

SELECT 
    IF(qry.pFamily=@lastFamily,'',@lastFamily:=qry.pFamily) AS family,
    IF(qry.pSubFamily=@lastSubFamily,'',@lastSubFamily:=qry.pSubFamily) AS subFamily,
    qry.pUid AS qUID,
    qry.pPlu AS qPLU,
    qry.pDescription AS qDesc,
    replace(round(qry.pSalesPrice/100,2),'.',',') as pPrice
FROM (
   SELECT
   @lastFamily ='',
   @lastSubFamily ='',
   IF(sf.RecordDeleted=0,
        SUBSTR(concat(f.description,"\n"),1,20),
        SUBSTR(concat("Sem familia\n"),1,20)) AS pFamily,
   IF(sf.RecordDeleted=0,
        SUBSTR(concat("    ",sf.description,"\n"),1,30),
        SUBSTR(concat(""),1,30))
        AS pSubFamily,
    p.ItemID AS pUid,
    IF(p.ProductLookUp IS NULL,'0',p.ProductLookUp) AS pPlu,
    SUBSTR(p.ShortDescription1,1,20) AS pDescription, 
    SUBSTR(prop.SalesPrice1,1,10) AS pSalesPrice
    FROM plus p
    INNER JOIN properties prop on p.PropertyUID = prop.uid 
    INNER JOIN families f on p.FamilyID = f.UID
    INNER JOIN subFamilies sf on p.SubFamilyID = sF.UID 
    WHERE p.RecordDeleted=0 
    ORDER BY pFamily, pSubFamily,pDescription
) AS qry;

変数 lastFamily および lastSubFamily の使用の背後にある考え方は、繰り返されるテキストを置き換えて、クリーンですぐに使用できる結果セットを取得することです。

最初の実行で私は得る

'Bebida', '    Agua', '22', ?, '1/4 Castelo', ?
'Bebida', '    Agua', '23', ?, 'Agua 0.33cl', ?
'Bebida', '    Agua', '24', ?, 'Agua 0.50cl', ?
'Bebida', '    Agua', '25', ?, 'Agua 1.5l', ?
'Bebida', '    Agua', '26', ?, 'Agua c/Sabor', ?
'Bebida', '    Agua', '27', ?, 'Agua Gás', ?
'Bebida', '    Alcoolica', '1', ?, 'Alianca Velha', ?
                    (etc...)

しかし、2回目にクエリを実行すると、目的の結果が得られます

'Bebida', '    Agua', '22', ?, '1/4 Castelo', ?
'', '    ', '23', ?, 'Agua 0.33cl', ?
'', '    ', '24', ?, 'Agua 0.50cl', ?
'', '    ', '25', ?, 'Agua 1.5l', ?
'', '    ', '26', ?, 'Agua c/Sabor', ?
'', '    ', '27', ?, 'Agua Gás', ?
'', '    Alcoolica', '1', ?, 'Alianca Velha', ?
                    (etc...)

ここでの私の質問は、lastFamily と lastSubFamily を初期化して最初の実行で設定する方法 (どこで) かです。

新しい mysql セッションを開始するたびに、これが発生し、その後は発生しません。したがって、変数はどこかに保存されていると思います。キャッシュの消去とテーブルのフラッシュを試みましたが、結果は同じです。

何か案は?

乾杯

4

1 に答える 1

1

「繰り返される」値を非表示にするために SQL を使用してクロス集計レポートを生成しようとしているようです...「グループ化された」列を 1 回だけ表示し、残りの行を空白にする必要があります。

Family     SubFamily   qUID    qPLU    qDesc         qPrice
-----------------------------------------------------------
Bebida     Auga        22      ?       1/4 Castelo   ?
                       23      ...
                       24      ...
                       25      ...
                       26      ...
                       27      ...
           Alcoolica   1       ...
Family2    SubFamily1  15
                       16
           SubFamily2  15
                       16

MySQL リファレンスには次のように記載されていることに注意してください。

原則として、ユーザー変数に値を割り当てたり、同じステートメント内で値を読み取ったりしないでください。期待どおりの結果が得られる可能性がありますが、これは保証されません。ユーザー変数を含む式の評価順序は定義されておらず、特定のステートメント内に含まれる要素に基づいて変わる場合があります。さらに、この順序は、MySQL サーバーのリリース間で同じであるとは限りません。

このタスクは、データベースから取得したデータ セットを表示およびフォーマットするクライアント アプリケーション/レポート ツールにより適しています

リレーショナル テーブルでは、各行が他の行から独立しているため (セットが順序付けられている場合でも)、SQL でこれを簡単に行うのは難しいでしょう。これを達成するために一部の DBMS で分析関数を使用する方法があるかもしれませんが、結果セットを表示している手続き型言語でこれを行うことを強くお勧めします。サブファミリーはトリックを行う必要があります。

于 2012-04-26T13:45:40.137 に答える