- PR -

[MySQL] クエリの結果が明らかに正しくない

投稿者投稿内容
Tasuku
大ベテラン
会議室デビュー日: 2006/09/14
投稿数: 106
お住まい・勤務地: tokyo
投稿日時: 2006-09-14 23:25
はじめまして。

PHP + MySQLにてWebAPLを作成中なのですが、とあるSELECTクエリの結果が
明らかに正しくないという事象が発生しています。
 ・SELECT * FROM 〜 WHERE …
  → WHERE 条件にあてはまらない結果が数件混入する
 ・SELECT count(*) FROM 〜 WHERE …
  → WHERE 条件に該当する件数よりも数件多い応答がある

デバッグのため、PHPから発行しているSQLをダンプして、それをそのまま
mysql のCUIにコピペ、同じSELECTクエリを発行しました。すると、上記2つ
のクエリとも、正しい結果が応答されました。

そこで、PHPのコード中で、同一のクエリを2回連続で発行してみました。
すると、1回目のクエリは、上記の最初の事象と同じ結果、2回目のクエリは
正しい結果、がそれぞれ応答されました。

症状からして、MySQL のバグ?と思えなくもないのですが、PHPのコード中、
特定の処理(別テーブルへのINSERT)を実行した後に、問題のSELECTクエリを
発行すると、この事象が発生するという点も気になるところです。

コード中、SELECTはかなりの数を発行していますが、表立って問題になっている
のは1箇所のみです。

どなたか、似たような経験をお持ちの方はいらっしゃいませんでしょうか。

Linux Kernel:2.4.31 (レンタルサーバなのでディストリビューション不明)
PHP: 4.4.0 (Zend Engine)
Tasuku
大ベテラン
会議室デビュー日: 2006/09/14
投稿数: 106
お住まい・勤務地: tokyo
投稿日時: 2006-09-14 23:28
肝心な情報を書き忘れました。
MySQL: 4.0.25
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2006-09-15 04:59
delete して commit する直前のテーブルを1回目の select で表示した直後にテーブルの状態が変わってしもてるので、その delete 後の状態の変わったテーブルを2回目の select で表示すると結果が違うもんになる・・・?
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-09-15 06:43
引用:

Tasukuさんの書き込み (2006-09-14 23:28) より:
肝心な情報を書き忘れました。
MySQL: 4.0.25


もうひとつ重要な情報を忘れている。テーブル型は何?
99ri
大ベテラン
会議室デビュー日: 2006/09/09
投稿数: 129
投稿日時: 2006-09-15 07:12
http://www.atmarkit.co.jp/fnetwork/rensai/sql27/sql1.html
を参考にしてください
MYSQLのトランザクションレベルはどれになるかわかりますか?
Tasuku
大ベテラン
会議室デビュー日: 2006/09/14
投稿数: 106
お住まい・勤務地: tokyo
投稿日時: 2006-09-15 08:16
引用:

コブラさんの書き込み (2006-09-15 04:59) より:
delete して commit する直前のテーブルを1回目の select で表示した直後にテーブルの状態が変わってしもてるので、その delete 後の状態の変わったテーブルを2回目の select で表示すると結果が違うもんになる・・・?



1回目、2回目の間に他のDBアクセスは発生していません。
また、1回目の結果に含まれる余計なレコードは、削除・更新問わず、
全く関係無いレコードです。
like '%hoge%' で検索して hoge1, hoge2, page1 が返ってくるような感じです。

引用:

甕星さんの書き込み (2006-09-15 06:43) より:
もうひとつ重要な情報を忘れている。テーブル型は何?



MyISAMになります。

引用:

99riさんの書き込み (2006-09-15 07:12) より:
http://www.atmarkit.co.jp/fnetwork/rensai/sql27/sql1.html
を参考にしてください
MYSQLのトランザクションレベルはどれになるかわかりますか?



調べてみます。
ただ、MyISAMですので、LOCK/UNLOCKだけで、TRANSACTION/COMMIT
は使用していません。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-09-15 12:28
SQLではなくPHPのコーディングミスのような気がします。
結果をどのように格納しているのかわかりませんが、ロジックを見直してみたほうが
いいのではないでしょうか。
末記人
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 233
お住まい・勤務地: あわにこ
投稿日時: 2006-09-15 20:59
こんにちは

条件にORとかANDがたくさんあったりしませんか?
かっこで範囲の限定などはきちんとなされていますか?

差し支えない範囲でSQLを公開してみるのも早道だと思います。

スキルアップ/キャリアアップ(JOB@IT)