添付の図に記載したテーブル構造に関するSQLの質問です。
(何度も同じ質問すいません。)
図中のテーブルCのレコードをとりたいと思っています。
ただし、TableAのId=1に対応するもののみを取得したいです。
そこで、↓のようなSQL文を実行してみました。
=====
SELECT
tablea.Name as Name_A,
tableb.Name as Name_B,
tableb.DateTime as DateTime_B,
tablec.Id as Id_C,
tablec.Name as Name_C
FROM tablec
inner join tabled on tabled.Id_C = tablec.Id
inner join tableb on tableb.Id = tabled.Id_b
inner JOIN tablea on tablea.Id = tableb.Id_A
where tablea.Id=1
====
そうすると、当然ですが、tablecのレコードが重複してしまうことがあります。
具体的には、TableCのId=1,2が重複してしまいます。
図の「SQL文の実行結果(1)」に書いています。
そこで、重複してしまうレコードに関しては、tableb.DateTimeが最も新しいものを1つだけ選択したいと思っています。
なので、今度は↓のようなSQL文を実行しました。
====
SELECT
tablea.Name as Name_A,
tableb.Name as Name_B,
max(tableb.DateTime) as DateTime_B,
tablec.Id as Id_C,
tablec.Name as Name_C
FROM tablec
inner join tabled on tabled.Id_C = tablec.Id
inner join tableb on tableb.Id = tabled.Id_b
inner JOIN tablea on tablea.Id = tableb.Id_A
where tablea.Id=1
group by tablec.Id
order by tableb.datetime desc
;
====
そうすると、図の「SQL文の実行結果(2)」のような結果が得られます。
この場合、おおむね期待通りの結果が得られますが、tableb.nameの値が全てXXXになってしまっています。
期待する結果は図の「期待する結果」に書いた通りのものです。
どうしたら、期待する結果を得ることができるでしょうか?
よろしくお願いいたします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
本来、GROUP BY には集約関数以外の列を全部記述する必要があります。
SQLとして正しいのは、GROUP BY に列を追加した
GROUP BY tablea.Name,tableb.Name,tablec.Id,tablec.Name
あるいは、Group BY で指定した列だけをSELECTに記述した
SELECT max(tableb.DateTime) as DateTime_B,tablec.Id as Id_C
になります。
で、どちらも、あなたが欲しいデータとは違います。
MySQLでは、GROUP BY に独自の拡張がされていて、全部記述する必要がなくなっています。
ただし、GROUP BY で指定した組合せに対して、1対多で対応している列
(今回なら、 id_C と id_B の関係)
の場合、どの値が選ばれるかは保証しない、ということです。
MySQL 8以降なら、 Window関数が使えるので
・Row_NUMBER() でid_C毎に行番号を付けて、 行番号=1だけを抽出
・Window関数版の max() でid_C毎に最大日時を付けて、 tableB.DateTime=Datetimeの最大 だけを抽出
とかできます。
No.1
- 回答日時:
画像が見えず把握できませんけど(知恵袋なら拡大表示もできるのに)、前回までの様子から
>tablea.Id=1
と
>tableb.DateTimeが最も新しいもの
が両立する事はないのではないかと思いましたけど、今回の質問でテーブルのデータは見直されたのでしょうか?
それともあくまで今まで通りのデータ群から抽出しようとしているのか?
(無理と思えるのですが・・・素人目では)
コード以前に抽出できるかどうかフローチャートなどで検証されてみては?
仮にそれで抽出可能であったと言うのであれば、それを提示してみる。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL MySQLにて特定レコードのみを抽出したい 3 2021/11/19 01:53
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- JavaScript 付属の写真のようにエラーが出るようにしたいです。 提示したコードだけでは、エラーメッセージ文字が上の 1 2021/11/23 08:27
- PostgreSQL 画像とカテゴリーを出力したいのですが、取得の条件を付ける方法がわかりません。 2 2022/05/01 18:03
- JavaScript 【急募】選択した物件と施設の距離をランキング&条件によって画像表示を変更する方法。 2 2021/12/24 07:08
- JavaScript javascriptとPHPで入力フォームのコードを書いているのですが、 流れとしては、①入力フォー 2 2021/12/02 09:18
- MySQL テーブル作成です。どこかのスペルが間違っているか記号など スペースかな? 1 2022/10/01 05:08
- Word(ワード) word_VBA_フォームからダイアログそこからの復帰について 2 2021/12/13 23:44
- JavaScript html selectの内容を初期値に戻す 2 2021/11/10 18:29
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
データの二重表示の原因
-
Accessでの排他制御
-
Access 削除クエリが重い
-
3つ以上のテーブルをUNIONする...
-
Accessにインポートしたら並び...
-
accessで検索&入力 データの...
-
数百万件レコードのdelete
-
Access カレントレコードがあり...
-
非連結サブフォームのレコード...
-
C# Windows Forms で、Accessみ...
-
Access 1レコードずつcsvで出力...
-
Access VBA Me.Requery レコー...
-
一部重複しているレコードの削除
-
Accessでのレコードの削除時の...
-
ManagementStudioからのデータ削除
-
レコードロックする方法
-
テーブルのレコード削除ができ...
-
AccessのSQLについて教えてくだ...
-
ACCESSのBookmarkプロパティの...
-
(ACCESS)並び替えをしないで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessにインポートしたら並び...
-
データの二重表示の原因
-
2つの項目が重複するレコード...
-
3つ以上のテーブルをUNIONする...
-
数百万件レコードのdelete
-
Access VBA Me.Requery レコー...
-
非連結サブフォームのレコード...
-
Access 削除クエリが重い
-
ACCESSのBookmarkプロパティの...
-
Access 1レコードずつcsvで出力...
-
ManagementStudioからのデータ削除
-
Accessの重複クエリで最小以外...
-
Accessでの排他制御
-
Accessで重複したデータを一件...
-
(ACCESS)並び替えをしないで...
-
フォームからのレコード削除に...
-
SQLServerで同一条件レコードの...
-
Accessでの禁止文字チェック
-
Accessでレコードが更新された...
-
テーブルのレコード削除ができ...
おすすめ情報
画像がつぶれて見えなくなってしまったので、↓にアップロードしました。
https://imgur.com/y676vrH
図の中の「SQL文の実行結果(1)」を見て、表の中の「Id_C」は1,2,3の三つあり、
そのため、欲しいデータはこれらId_C=1,2,3のものになります。
んで、Id_C=1,2に関しては、レコードが複数あるので、それら複数のうち、
DateTime_Bが一番新しいレコードを選択します。
なので、最終的に欲しいものは「期待する結果」に記載したものとなります。
最悪、「SQL文の実行結果(1)」を取得して、そのあと何らかのプログラムを使えば
「期待する結果」に書いたものが取得できますが、SQLだけでできる方法があれば、
それも知っておきたいという感じです。