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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

4125閲覧

MYSQLで最初の行のみ値を表示したいです。

super

総合スコア33

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2015/10/09 11:50

こんにちは。

次のようなテーブルから重複しない値を最初の1行のみ表示したいと思います。

下のリンクからテーブルの構造とクエリを試すことができます。

http://sqlfiddle.com/#!9/76c479/1/0

1.変更前

SQL

1> SELECT date, goods, type, value FROM container ORDER BY date, goods; 2 3date goods type value 4日付 商品 タイプ type1:入庫、type2:出庫 52015/10/1 牛乳パック 1 50 62015/10/1 牛乳パック 2 30 72015/10/1 牛乳パック 2 20 82015/10/1 牛乳パック 1 100 92015/10/1 牛乳パック 2 70 102015/10/1 弁当 1 20 112015/10/1 弁当 1 20 122015/10/1 弁当 2 20 132015/10/1 弁当 1 50 142015/10/1 弁当 2 30 152015/10/1 パン 1 100 162015/10/1 パン 2 80 172015/10/1 パン 2 20 182015/10/1 パン 1 30 192015/10/1 パン 2 20 202015/10/2 ........ 21…………..

2.期待値

SQL

1> SELECT date, goods, type, value FROM container ORDER BY date, goods; 2 3date goods type value 4日付 商品 タイプ type1:入庫、type2:出庫 52015/10/1 牛乳パック 1 50 6 2 30 7 2 20 8 1 100 9 2 70 10 弁当 1 20 11 1 20 12 2 20 13 1 50 14 2 30 15 パン 1 100 16 2 80 17 2 20 18 1 30 19 2 20 202015/10/2 ........ 21…………..

よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

ユーザー変数を使用すれば、以下のSQLで実現できます。

sql

1SET @main_id = 0, @sub_id = 0; 2SELECT 3 CASE WHEN main.date = sub.date THEN '' ELSE main.date END AS date, 4 CASE WHEN main.date = sub.date AND main.goods = sub.goods THEN '' ELSE main.goods END AS goods, 5 main.type, 6 main.value 7FROM 8(SELECT 9 @main_id := @main_id + 1 AS rowid, date, goods, type, value 10 FROM container 11 ORDER BY date, goods 12) AS main 13LEFT OUTER JOIN 14(SELECT 15 @sub_id := @sub_id + 1 AS rowid, date, goods, type, value 16 FROM container 17 ORDER BY date, goods 18) AS sub ON main.rowid = sub.rowid + 1 19ORDER BY main.rowid ASC;

しかし、トリッキーな方法である上に
レコードの数が増えるにしたがって劇的にパフォーマンスが悪化するはず(※)なので、お勧めできません。
※以下の実行計画を見ると、テーブルのフルスキャンが実質4回、実行されています。
実行計画

私もm6u様と同じく、プログラム側で対処するのが良いと思います。

投稿2015/10/09 16:09

KiyoshiMotoki

総合スコア4791

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

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

0

mysqlにあまり関係ないですが、
結果を取得して表示する側の処理系(例えばwebにphpで表示するならphp側の処理)で、
直前に表示したdateやgoodsをローカル変数に保持しておき、
今回読みだしたデータと一致したら出力しない、
というアルゴリズムではいかがでしょうか。

投稿2015/10/09 12:10

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

super

2015/10/09 12:15

ご回答ありがとうございます。 似たような処理が多いため、できればクエリで処理したいと思っております。
guest

0

ベストアンサー

http://sqlfiddle.com/#!9/76c479/1/0
のように連番の id があるなら、下記でいけそうです。

SQL

1SELECT 2 a.id, 3 a.date, 4 CASE WHEN a.date = b.date THEN '' 5 ELSE a.date END As date, 6 CASE WHEN a.goods = b.goods THEN '' 7 ELSE a.goods END As goods, 8 a.type, b.value 9FROM 10 container a LEFT JOIN container b ON a.id - 1 = b.id 11ORDER BY a.id;

投稿のサンプルのように id がなければ、そもそも並び順が保証されないですね。

id が連番でないと、かなり複雑かつ重くなりそうですので、他の方も言われてるように表示側のプログラムで対処するほうがよいと思います。

投稿2015/10/09 17:09

編集2015/10/09 17:19
hatena19

総合スコア33699

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

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

super

2015/10/13 00:19

勉強になりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問