🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
SQL

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

Q&A

解決済

3回答

1236閲覧

sqlで2回検索するものを一度で検索したい

tarotarotarotar

総合スコア41

SQL

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

0グッド

0クリップ

投稿2021/01/25 11:57

編集2021/01/26 01:39

希望の条件がどうしても抽出できません。
教えて頂けますでしょうか。

以下前提

テーブル
line_webhook_events

カラム
id,
source_user_id,
event_type,

希望条件

①全てのsource_user_idを抽出。重複した場合、idが一番大きいもののみ抽出
② ①で抽出したものからevents_type=5を抽出

以上です。

ver
+-----------+
| @@VERSION |
+-----------+
| 8.0.22 |
+-----------+
1 row in set (0.00 sec)
mysql Ver 8.0.22 for osx10.16 on x86_64 (Homebrew)

サンプル

sql

1+----+----------+----------------------------+ 2| id | source_user_id | event_type 3+----+----------+----------------------------+ 4| 1 | A | 5 5| 2 | B | 1 6| 3 | B | 5 7| 4 | C | 5 8| 5 | C | 1 9| 6 | D | 5 10| 7 | D | 1 11| 8 | D | 5 12+----+----------+----------------------------+

抽出したいデータ(①を抽出した上で②で抽出)
A,
B,
D

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

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

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

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

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

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

yambejp

2021/01/25 12:09

特殊なことをやろうとするならSQLの種類やバージョンを提示下さい
sazi

2021/01/25 12:47 編集

外側のwhere条件にevents_type=5を追加するだけじゃ駄目なんですか?
yambejp

2021/01/26 01:20 編集

元の質問が大幅に変わってしまって、命題が不明瞭です またsql(RDB)の名前はなんでしょう?まずはそこから サンプルデータをテキスト(できればcreate table+insert)で例示下さい
tarotarotarotar

2021/01/26 01:39

大変ご迷惑をおかけしております。修正いたしました。ご確認下さいませ。
guest

回答3

0

ベストアンサー

SQL

1select source_user_id from tbl as t1 2where not exists(select 1 from tbl where t1.source_user_id=source_user_id and t1.id<id) 3and event_type=5

投稿2021/01/26 01:50

yambejp

総合スコア116690

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

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

tarotarotarotar

2021/01/26 01:53

ご丁寧にありがとうございました!抽出できました。
guest

0

下記でどうでしょう。

sql

1SELECT t1.* 2FROM 3 line_webhook_events as t1 4 INNER JOIN 5 (SELECT source_user_id, Max(line_webhook_events.id) AS id 6 FROM line_webhook_events 7 WHERE events_type=5 8 GROUP BY source_user_id) AS t2 9 ON t1.source_user_id = t2.source_user_id 10 AND t1.id = t2.id;

追記

質問内容が変更されたので、変更後の仕様だと、下記でしょうか。

sql

1SELECT t1.* 2FROM 3 line_webhook_events as t1 4 INNER JOIN 5 (SELECT source_user_id, Max(line_webhook_events.id) AS id 6 FROM line_webhook_events 7 GROUP BY source_user_id) AS t2 8 ON t1.source_user_id = t2.source_user_id 9 AND t1.id = t2.id 10 WHERE events_type=5;

WHERE句を外に出しただけです。

投稿2021/01/25 12:24

編集2021/01/26 01:58
hatena19

総合スコア34073

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

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

tarotarotarotar

2021/01/26 01:17

ありがとうございます!こちら動いたのですが、私の抽出したい条件がそもそも誤っておりました。 文章を編集させていただいております。 恐らくお答え頂いたコードの順番を入れ替えればいいだけ?かなと思うのですがどの箇所かわからずで困っております・・・大変お手数おかけしますがご教示頂けますと幸いです。
guest

0

動かしてませんが、以下はどうでしょうか。
お使いのデータベースがわからないので動くかどうかはわかりませんけれども。

select * from line_webhook_events as t1 where id=(select max(id) from line_webhook_events where source_user_id=t1.source_user_id and events_type=5) and events_type=5
select * from line_webhook_events where events_type=5 order by id desc limit 1

↑は id が一意でないと結果は不定と思われます。

あとは集計関数を使うとか。rank over とかで検索してみてください。

投稿2021/01/25 12:23

68user

総合スコア2022

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問