2012-04-24 11 views
0

私は把握できず、ナットを運転しているという問題があります。サブクエリとユーザ変数

私は値

SELECT 
    IF([email protected],'',@lastFamily:=qry.pFamily) AS family, 
    IF([email protected],'',@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...) 

を取得する最初の実行で

が、私は私が望む結果を得るクエリ

'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セッションを開始するたびにこれが起こり、それは起こりません。だから私は変数がどこかに格納されていると思います。キャッシュをクリーニングしてテーブルをフラッシュしようとしましたが、結果は同じです。

アイデア?

乾杯

+0

変数を使用しているかどうかわかりません。あなたのデータモデルはどのように見えますか?これらの変数を使用せずに結果を得ることができるでしょう... –

+0

基本的には、最初の牽引列のテキストが繰り返されているかどうかを確認するために、メインクエリでテキストを解析しています。それが繰り返されると空のテキストに置き換えられます。私は2つの変数を比較するテキストを保持します。 –

答えて

1

あなたが「繰り返し」の値を隠すためにSQLを使用したクロスタブレポートを生成しようとしているようですが、あなたがだけにして、「グループ化」の列は、一度表示されるように残りのためのブランクたい音...行。

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 referenceはその言うことを注意:一般的なルールとして

、ユーザー変数 に値を割り当てないと、同じ文の中に値を読んでください。期待通りの結果が になることがありますが、これは保証されていません。ユーザー変数を含む式の の評価順序は未定義であり、与えられたステートメントに含まれる要素に基づいて が変更されることがあります。 さらに、この順序はMySQLサーバの リリース間で同じであることが保証されていません。

このタスクは、ずっとデータベースから取得したデータセットを表示して書式設定されたクライアントアプリケーション/レポーティングツールに、より適しています。

リレーショナル表では、各行は他の行とは独立しているため(セットが注文されている場合でも)、SQLでこれを簡単に実行するのは難しいでしょう。これを達成するためにDBMSの分析関数を使用するメソッドがあるかもしれませんが、実際には、結果セットを表示している手続き型言語でこれを行うことを強くお勧めします - 前のファミリ/サブファミリーはそのトリックを行うべきです。

+0

うん、それは私が恐れていたものだった。私は単にクエリの結果値を出力することで、レポートを実装するいくつかのレガシーコードに取り組んでいます。このケースではほとんどのケースでうまく機能しますが、最初の実行では常に失敗します。私は "レポートプリンタ"を変更しない方法を見ていましたが、私はこの考えを最初から持っていました。クエリーに依存するものをすべてにすることは複雑なクエリーにつながります;) –