3

これは私の初めての質問ですので、しばらくお待ちください.. :)

私たちは 2 人の開発者であり、同じテーブルと値を持つ同じ MySql DB を持っています。

1つはMySqlバージョン5.5で、他の開発者から言われたように(明らかに)正常に動作します。

MySql 5.1.44 (基本的な MAMP インストール) を使用しているマシンでは、次の奇妙な問題があります。

非常に大きなクエリ (私のものではない) は、「Column 'xd' cannot be null」というエラーで失敗します。

ピースを削除すると、次のようにスリム化されます。

select xd, avg(media) from questionario_punteggi where somefield = 1 union select 1,2

somefield = 1 のレコードがないため、最初の選択で空のセットが返されることに注意してください。

空のセット UNION を返す AVG() 関数を使用した SELECT があります 何かを返す別の SELECT (1,2 は、私が例として挙げた単なるランダムな値です)

  • AVG() を削除すると、クエリが機能します。
  • xd (および右側の 1,2 の 2) を削除すると、クエリは機能します。
  • UNION を削除すると、クエリが機能します。
  • somefield = 1 でレコードを設定すると、クエリが機能します。
  • 他のマシン 5.5 では、クエリが機能します。

それ以外の場合、エラーは次のとおりです。

1048 - 列 'xd' を null にすることはできません

フィールドは次のとおりです。

`xd` char(3) NOT NULL DEFAULT '001',
`media` decimal(7,4) NOT NULL DEFAULT '0.0000',
`somefield` tinyint(4) NOT NULL DEFAULT '0',

おやおや。何か助けはありますか?ありがとう。

アップデート

MySql 5.5 より前に修正された MySql <= 5.1 のバグとして報告されています。詳細はわかりませんが、情報源を信頼しています

4

2 に答える 2

3

のクエリの順序を逆にすることをお勧めしUNIONます。

これは、結果セット内の列のデータ型が a の最初SELECTUNION値によって決まるためです。あなたの場合、の最初の列は列UNIONの型を取りましたquestionario_punteggi.xd:つまり、CHAR(3) NOT NULL.

の最初の部分に集計関数を適用しているため、フィルター条件に一致するレコードがない場合でも、UNION結果は 1 行になります。(Aggregate) Functionsに記載されているとおり:GROUP BY

AVG()NULL一致する行がない場合に返します。

非表示 の列に取得される値xdは、通常、フィルターに一致するレコードから不確定に選択されたレコードになります (これが、とにかくそうしたくない理由です)。ただし、この場合、一致するレコードがないため、サーバーは代わりに返されます(属性NULLを持つ列に入ることができないことは明らかです)。NOT NULL

の順序を逆にすることUNIONで、列にNOT NULL属性がなくなります。列を適切にエイリアスする必要がある場合があります。

SELECT 1 AS xd, 2 AS avg_media
UNION
SELECT xd, AVG(media) FROM questionario_punteggi WHERE somefield = 1

これを使用して、観察結果を順番に説明します。

  • AVG() を削除すると、クエリが機能します。

    集計が実行されなくなったため、最初SELECTUNIONレコードセットは空のレコードセットになりNULL、最初の列にはレコードがありません。

  • xd (および右側の 1,2 の 2) を削除すると、クエリは機能します。

    非表示の列が選択されなくなったため、MySQLNULLはその場所に戻りません。

  • UNION を削除すると、クエリが機能します。

    これは、MySQL のバージョンと同僚のバージョンの間で修正された可能性が高いバグです:属性は実際には結果NOT NULLに適用されません。UNION

  • somefield = 1 でレコードを設定すると、クエリが機能します。

    非表示の列に選択された値は、一致するレコードからの不確定NULL値です (ただし、列の属性のために非値です)。

  • 他のマシン 5.5 では、クエリが機能します。

    このバグ (私はまだ探しています) は、MySQL の各バージョン間で修正されているはずです。

于 2013-01-18T15:49:38.120 に答える
2

を使用してみてくださいSELECT IFNULL();

Select IFNULL(xd,0), avg(media) f
rom questionario_punteggi 
where somefield = 1 
union 
select 1,2

http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_ifnull

于 2013-01-18T15:29:22.420 に答える