質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1189閲覧

【postgresql】PHPでDBの最新データ1件をCSVに出力したいが、CSVが生成されない

jam912sh

総合スコア25

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/09/08 12:36

編集2019/09/08 12:39

PHPでDBの最新データ1件をCSVに出力したいが、CSVが生成されません。
流れでは、並び替えをして1件抽出すればいいと思いますが、
そのようにコードを書いてみるとうまくCSVが生成されず困っております。
postgresqlにお詳しい方、ご教示のほど宜しくお願い致します。

期待動作は、id 2 の大阪のみのデータをcsvファイルに格納したいです。

DB

1//testテーブル 2id,name, 31,東京 42,大阪

php

1 //idを降順に並び替えて1件のみをCSVにする 2 $query = "COPY (SELECT * FROM test ORDER BY id DESC LIMIT 1) TO '/var/www/html/web/csv/list.csv' CSV HEADER"; 3 4 pg_query($conn, $query); 5 6 // PostgreSQLを切断 7 $close = pg_close($conn);

以下のコードでは問題なく1件CSVファイルが生成されますが、
id1の東京のデータが格納されます。

php

1 //idを1件のみをCSVにする 2 $query = "COPY (SELECT * FROM test LIMIT 1) TO '/var/www/html/web/csv/list.csv' CSV HEADER"; 3 4 pg_query($conn, $query); 5 6 // PostgreSQLを切断 7 $close = pg_close($conn);

補足情報(FW/ツールのバージョンなど)

PostgreSQL:10.4
PHP:7.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Excelの1件目を持ってくるのと違い、SQLではORDER BYを指定しない限り順序は保証されません。

投稿2019/09/08 13:18

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jam912sh

2019/09/08 21:37 編集

Orlofsky様 ご確認頂き有難うございます。 「ORDER BY」を指定しても、順序が変わらないという質問をさせて頂いております。 質問の仕方が悪く大変申し訳ございません、コードになにか不備等ございましたら、ご指摘頂きたく存じます。宜しくお願い致します。 $query = "COPY (SELECT * FROM test ORDER BY id DESC LIMIT 1) TO '/var/www/html/web/csv/list.csv' CSV HEADER";
Orlofsky

2019/09/08 22:28 編集

バグがあるのかもしれませんね。 SELECT t1.* FROM test t1 WHERE t1.id = (SELECT MAX(t2.id) FROM test t2) で試してみては?
jam912sh

2019/09/08 22:01

朝から申し訳ございません。コード有難うございます。 上記試してみましたが、変わらず、CSVは生成されないようで御座います。
Orlofsky

2019/09/08 22:33

データのidが文字型で定義してあって、中に全角文字が混ざっていたりしませんか? SELECT文は psql で実行しても同じでしょうか?
jam912sh

2019/09/09 01:23 編集

ご連絡遅くなり申し訳ございません。 全角文字はまじっていないようでございます。 idのデータ型はintegerでございます。 また、psqlにて試してみましたが、失敗するようで御座います。 パターン①成功 SELECT * FROM test LIMIT 1; | name | id -----------+------------+---- 東京 | 1 パターン②失敗 SELECT * FROM test ORDER BY id DESC LIMIT 1; ERROR: column "id" does not exist パターン③失敗 SELECT t1.* FROM test t1 WHERE t1.id = (SELECT MAX(t2.id) FROM test t2) ERROR: column t1.id does not exist 行 1: SELECT t1.* FROM test t1 WHERE t1.id = (SELECT MAX(t2.id) FRO...
jam912sh

2019/09/09 01:36 編集

Orlofsky様 この度はご教示頂き有難うございました。 今一度確認致しましたところ、DBのカラム名idが大文字のIDになっている事に気づきました。小文字のidに変更しましたところ、問題は解消されました。 psql で実行してみてはというアドバイスが大変参考になりました。 台風でなにかと大変なところ、大変助かりました。有難うございました。 ↓以下のコードには問題ございませんでした。 $query = "COPY (SELECT * FROM test ORDER BY id DESC LIMIT 1) TO '/var/www/html/web/csv/list.csv' CSV HEADER";
Orlofsky

2019/09/09 04:57 編集

解決されて何より。PostgreSQL では psqlでSQLが正しく実行できるか確認するのが定石です。最初から エラーメッセージを提示できたり、テーブル定義を CREATE TABLE で提示できていたら簡単に解決できていたかも?
jam912sh

2019/09/12 09:16

Orlofsky様 上記の件、大変勉強になりました。今後はそのように確認を致します。 ありがとうございました。また、私のミスに貴重なお時間を頂きまして有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問