1

非常に長いクエリから奇妙な結果が得られます。ここで簡単に説明します。

DROP TEMPORARY TABLE IF EXISTS table1;
CREATE TEMPORARY TABLE table1 AS
(SELECT 
parent.id as parent_id,
times.a_time,
times.sequence,
FROM times
LEFT JOIN parent ON times.parent_id=parent.id
WHERE times.stop_id=10);

DROP TEMPORARY TABLE IF EXISTS table2;
CREATE TEMPORARY TABLE table2 AS
(SELECT 
parent.id as parent_id,
times.b_time,
times.sequence,
FROM times
LEFT JOIN parent ON times.parent_id=parent.id
WHERE times.stop_id=15 );

--here comes PDO->exec();

SELECT table1.*, table2.b_time
FROM table1
LEFT JOIN table2 ON table1.parent_id=table2.parent_id
WHERE table2.parent_id IS NOT NULL AND table1.sequence<table2.sequence
ORDER BY table1.a_time

EMS MySQL Manager 2007 を使用してクエリをテストしています。PHP では PDO クエリを使用しています。

最終結果を得るために (PDO はこの完全なクエリを一度に実行して結果セットを返すことをサポートしていないことを知っています)、PDO->exec()一時テーブルの作成後に実行し (クエリのコメントを参照)、次に実行PDO->query()します最後のSELECT:

$db = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME, DB_USER, DB_PASS);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

$tempTablesSQL='DROP TEMPORARY TABLE IF EXISTS...'; //create temporary tables
$db->exec($tempTablesSQL);

$sql='SELECT table1.*, table2.b_time ...'; //JOIN and SELECT the results
$results=array();
foreach($db->query($sql) as $row){
  $results[]=$row;
}

print_r($results);

MySQL Manager では、クエリ全体を一度に実行し、それらの特定の ID に対して結果として 29 行を取得しています (レコードは以前に解析されたファイルから挿入され、結果を私が知っているファイルと比較することにより、これは正しいです)彼らは良い)。

しかし、PHP では、結果は 25 件しか得られず、 の値がまったく間違っていますb_time

だから、私の質問は次のとおりです。

  • 間違った結果が得られるのはなぜですか?

  • このクエリを呼び出す私のアプローチは (PHP で) 間違っていますか?

どんな助けでも大歓迎です。

--編集--

PDO だけでなく、mysqli_multi_query で試してみましたが、同じ間違った結果が得られました。

私が気付いた重要なことの 1 つは、一時テーブルの代わりに通常のテーブルを使用すると、結果に問題がないことです。

4

1 に答える 1