3

次のクエリを検討してください。

select FEE_NUMBER
from CARRIER_FEE CF
left outer join CONTYPE_FEE_LIST cfl on CF.CAR_FEE_ID=cfl.CAR_FEE_ID and cfl.CONT_TYPE_ID=3
where CF.SEQ_NO = (
    select max(CF2.SEQ_NO) from CARRIER_FEE CF2 
    where CF2.FEE_NUMBER=CF.FEE_NUMBER 
    and CF2.COMPANY_ID=CF.COMPANY_ID 
    group by CF2.FEE_NUMBER) 
group by CF.CAR_FEE_ID 

私のラップトップでは、これは結果を返しません。私のサーバーでまったく同じ(ダンプされた)データベースを使用すると、結果が返されます。

ラップトップでEXPLAINを実行すると、これが得られます

| id | select_type        | table | type  | possible_keys                               | key                   | key_len | ref                    | rows | Extra                                        |
+----+--------------------+-------+-------+---------------------------------------------+-----------------------+---------+------------------------+------+----------------------------------------------+
|  1 | PRIMARY            | CF    | index | NULL                                        | PRIMARY               | 8       | NULL                   |  132 | Using where                                  | 
|  1 | PRIMARY            | cfl   | ref   | FK_CONTYPE_FEE_LIST_1,FK_CONTYPE_FEE_LIST_2 | FK_CONTYPE_FEE_LIST_1 | 8       | odysseyB.CF.CAR_FEE_ID |    6 |                                              | 
|  2 | DEPENDENT SUBQUERY | CF2   | ref   | FK_SURCHARGE_1                              | FK_SURCHARGE_1        | 8       | func                   |   66 | Using where; Using temporary; Using filesort | 

私の他のすべてのサーバーではこれを提供します(ref列の違いに注意してください)

| id | select_type        | table | type  | possible_keys                               | key                   | key_len | ref                    | rows | Extra                                        |
+----+--------------------+-------+-------+---------------------------------------------+-----------------------+---------+------------------------+------+----------------------------------------------+
|  1 | PRIMARY            | CF    | index | NULL                                        | PRIMARY               | 8       | NULL                   |  132 | Using where                                  | 
|  1 | PRIMARY            | cfl   | ref   | FK_CONTYPE_FEE_LIST_1,FK_CONTYPE_FEE_LIST_2 | FK_CONTYPE_FEE_LIST_1 | 8       | odysseyB.CF.CAR_FEE_ID |    6 |                                              | 
|  2 | DEPENDENT SUBQUERY | CF2   | ref   | FK_SURCHARGE_1                              | FK_SURCHARGE_1        | 8       | odysseyB.CF.COMPANY_ID |   66 | Using where; Using temporary; Using filesort | 

結合、サブクエリ、または最後の group-by のいずれかを削除すると、期待どおりの結果が得られます。

これは構成の問題だと思いますが、これまでに見たことはありません。誰がこれを引き起こす可能性があるか知っていますか?

私のラップトップは、MySQL 5.0.41 で OSX 10.6 を実行しています。OSX 10.5.7 と MySQL 5.0.37 を実行している別のラップトップは正常に動作し、MySQL 5.0.27 を実行している Linux サーバーも同様です。

ref=func を使用した 1 つの説明計画と ref=odysseyB.CF.COMPANY_ID を使用した別の説明計画の違いを説明できる人はいますか?

ありがとう。

4

2 に答える 2

1

両方のマシンで:

mysql> SHOW CREATE TABLE CARRIER_FEE CF;

両方のテーブル ENGINE タイプが同じであることを確認してください。

また、エラーが発生したマシンで OS X 10.6 を使用しているためですか? おそらく、その OS のデータ型は 10.5.x とは品質が異なります。

Snow Leopard との互換性に問題があるようです。10.6 ラップトップに MySQL 5.4 をインストールしてみてください。

http://forums.mysql.com/read.php?10,278942,278942#msg-278942

于 2009-09-15T04:02:13.820 に答える
0

なぜ異なる結果をもたらすのかわかりません。EXPLAIN レポートで報告される行数が異なるため、まったく同じデータ ダンプはありません。仮定をテストするために、いくつかの単純なクエリを実行することをお勧めします。

また、両方のサーバーでまったく同じ SQL クエリを実際に実行していることを再確認してください。たとえば、誤って左外部結合を内部結合に変更した場合、クエリ全体で結果が返されない可能性があります。

ところで、あなたの質問に接していますが、これらの「グループごとに最大の行」タイプのクエリを外部結合で解決します。

select FEE_NUMBER
from CARRIER_FEE CF
left outer join CARRIER_FEE CF2
  on CF.FEE_NUMBER = CF2.FEE_NUMBER and CF.COMPANY_ID = CF.COMPANY_ID 
     and CF.SEQ_NO < cf2.SEQ_NO
left outer join CONTYPE_FEE_LIST cfl 
  on CF.CAR_FEE_ID=cfl.CAR_FEE_ID and cfl.CONT_TYPE_ID=3
where CF2.SEQ_NO IS NULL 
group by CF.CAR_FEE_ID;

このタイプのソリューションは、多くの場合、現在使用している相関サブクエリ ソリューションよりもはるかに高速です。それがクエリの結果を変える可能性があるとは思わないでしょう。オプションとして提供しているだけです。

于 2009-09-08T01:49:29.460 に答える