こんにちは。
mysqlのselect文なのですが、LEFT OUTER JOIN した右側をgroup byし、そのなかで最大値を持つものを結び付けたいのですが、四苦八苦やってみたところ2日ほど解決できず・・・。
どなたかご教授いただけますと助かります。
テーブルなどは以下の通りです。
---tableA----(テーブル名)
user / supplier(カラム名、以下レコード)
1 / 1
1 / 2
1 / 3
2 / 1
2 / 3
---tableB---
skuno / supplier / update_at
1 / 1 / 2011-12-12
2 / 1 / 2011-12-13
3 / 1 / 2010-11-10
検索の目的は、特定のカラムuserに対応する(例えばuser = 1)supplierの値(1,2,3)を取り出し、tableBにおいて、それぞれの値に結びつくskunoのうち最新のupdate_atを持つskunoを取り出したいというものです。
上記の例の場合、希望する検索結果は以下のような想定です。
supplier / skuno
1 / 2
2 / null
3 / null
私が検討してみたsql文は以下の通りなのですが、
select supplier,skuno from tableA LEFT JOIN tableB ON tableA.supplier = tableB.supplier where tableA.user = 1 and tableB.update_at IN (select max(update_at) from tableB group by supplier) group by tableA.supplier;
この場合だと、右側がnullだとsupplierの値が表示されず、
supplier / skuno
1 / 2
となってしまいます。
select supplier,skuno from tableA LEFT JOIN tableB ON tableA.supplier = tableB.supplier where user = 1 group by supplier;
だと右側のテーブルの値が指定できず・・・
ここからどのように条件付けをしたらよいのか、お力添えをいただけますと幸いです。
よろしくお願い申し上げます。
No.1ベストアンサー
- 回答日時:
こうすれば希望する検索結果になるんじゃないでしょうか
SELECT a.supplier,b.skuno,max(update_at) from a
LEFT JOIN b ON a.supplier = b.supplier
WHERE a.user = 1 GROUP BY a.supplier;
問題はupdate_atフィールドで、「update_at IN (select max」の条件が適用される時、結合テーブルからsupplier2,3が消えるのが困るわけですよね。
まさにその通りです!
なんだかややこしい方に考えてしまっていたみたいで・・・。
お力添えの程、ありがとうございましたm(_ _)m
No.3
- 回答日時:
こうですね
select a.supplier,b.skuno
from tableA as a
left join tableB as b on b.supplier=a.supplier
and (b.supplier,b.update_at) IN (select supplier,max(update_at) as update_at from tableB group by supplier)
where user=1
No.2
- 回答日時:
こんな感じでしょうか・
MySQLの環境が無く動作確認はしていないので、文法エラーなどがあったら適宜修正してください。
select A.supplier, B.skuno
from tableA as A
left join tableB as B on (
A.supplier = B.supplier
and B.update_at IN (
select max(update_at)
from tableB as B2
where B.supplier = B2.supplier
group by supplier))
where A.userid = 1;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle SQL update方法 2 2022/06/22 14:07
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- MySQL SQLです。下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「昨年の各月の総降 1 2023/07/01 00:32
- MySQL うまくいきません教えてくださいお願いしますSQLです。クエリ構文です。 1 2023/07/07 12:39
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- PostgreSQL SQLで検索結果の記事を表示したい 1 2022/04/28 21:03
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
このQ&Aを見た人はこんなQ&Aも見ています
-
「環境が人を育てる」って本当?環境によって人格や生き方は本当に変わるのか
環境が人生に与える影響は実際どれほどのものなのか、専門家の田宮由美さんに伺った。
-
GROUP BYを行った後に結合したい。
Oracle
-
LEFT JOIN と GROUP BY
MySQL
-
MAX関数を使ってからLEFT JOINしたいのですが・・
PHP
-
-
4
SQLで特定の項目の重複のみを排除した全項目を取得する方法
その他(プログラミング・Web制作)
-
5
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
6
SQLのVARCHARとVARCHAR2の違い
その他(データベース)
-
7
GROUP BYでエラーが発生
SQL Server
-
8
結合したテーブルをSUMしたい
MySQL
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
OUTER JOIN とgroup by
-
SQLローダーCSV取込で、囲み文...
-
select文の実行結果に空白行を...
-
単一グループのグループ関数で...
-
【PL/SQL】FROM区に変数を使う方法
-
<SQL>重複しているデータの場合...
-
テーブルの最後(最新)のレコー...
-
並べ替えについて
-
Oracleで「文字が無効です」の...
-
group byの並び順を変えるだけ...
-
2つの列が同じ値の行を取得するSQL
-
SQL*Loader Append
-
トランザクションログを出力せ...
-
「数字で始まらない」ものを抽...
-
VC++ (ADO) で Access の Yes/N...
-
複数レコードを横並び1レコー...
-
SQL 重複しないJoinの仕方を教...
-
ファイルの漢数字の順番につい...
-
エクセルの縦列のソートできま...
-
1の行を固定した上でVBAを用い...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
count関数の値をwhere句で使用...
-
OUTER JOIN とgroup by
-
結合したテーブルに名前をつけ...
-
最大値の数をカウントしたい
-
グループ内最大値に印を付けるS...
-
SQL 自己結合で件数の条件指定
-
【バグ?】ORDER BY DESCでempty
-
同一カラム名でjoinしたところ...
-
ビュー定義に集約関数を入れる...
-
ストアドファンクションの再帰...
-
市区町村別の件数をカウントす...
-
SQL 重複レコードの数え方
-
SQLローダーCSV取込で、囲み文...
-
単一グループのグループ関数で...
-
select文の実行結果に空白行を...
-
テーブルの最後(最新)のレコー...
-
【PL/SQL】FROM区に変数を使う方法
-
AccessのSQL文で1件のみヒット...
-
レコードの登録順がおかしい
-
SELECT FOR UPDATE で該当レコ...
おすすめ情報