質問: $conn->prepare($sqlStr); // ※バインド $stmt->bindValue(':test', '%test%', PDO::PARAM_STR); // SQL実行 $stmt->execute($sqlStr); ``` 上記のSQLの結果をファイルに出力したいのですが、エラーが発生して出力できません。 エラーメッセージは以下が出力されます。 【エラーメッセージ】 SQLSTATE[28000]: Invalid authorization specification: 1045 Access denied for user 'user'@'123.456.789.111' (using password: YES) APサーバー:123.456.789.111 DBサーバー:123.456.789.000 ※数値は適当 上記のPHPを実行しているAPサーバーとDBサーバーが異なるため、 DBサーバーの結果をAPサーバーに出力できないと思います。 このような状態でSQLの結果をファイルに出力することは可能でしょうか? 補足: 「INTO OUTFILE」が付与されていないときはエラーは発生しませんでした。
回答: 検討、実験した結果、以下のような処理になりました。 1.サブテーブルの最大件数を取得する。 SELECT COUNT(id) id_count FROM sub_table GROUP BY id ORDER BY id_count DESC LIMIT 1 2.「1.」で取得した件数でループしてサブテーブル部分のSQLを作成する。 SELECT main.*, // ここをPHPのループで作成 (SELECT id sub_id FROM sub_table sub WHERE sub.main_id = main.id LIMIT 0, 1) sub_id1, (SELECT sub_note sub_note FROM sub_table sub WHERE sub.main_id = main.id LIMIT 0, 1) sub_note1, (SELECT id sub_id FROM sub_table sub WHERE sub.main_id = main.id LIMIT 1, 1) sub_id2, (SELECT sub_note sub_note FROM sub_table sub WHERE sub.main_id = main.id LIMIT 1, 1) sub_note2, ・・・ FROM main_table main 3.「2.」を登録するテーブルを作成する。 CREATE TEMP_TABLE (カラム); 4.「2.」をINSERTする。 INSERT INTO TEMP_TABLE 「2.」のSELECT; 5.PHPのexec()でリダイレクト出力する。 mysql -u root -ptest 'SELECT * FROM TEMP_TABLE' > test/test.csv 6.「3.」のテーブルを削除する。 DROP TABLE TEMP_TABLE;