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

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

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

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

PHP

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

Q&A

解決済

3回答

1545閲覧

mysqlで指定した条件でデータを抽出したい

u-sukesan

総合スコア156

MySQL

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

PHP

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

1グッド

0クリップ

投稿2019/01/10 11:51

mysqlにて下記のようなテーブルから

tableA

nodatto_userfrom_user
102018-12-31 12:10:00AさんBさん
92018-12-30 12:10:00BさんAさん
82018-12-30 11:10:00AさんBさん
72018-12-21 12:10:00CさんAさん
62018-12-11 12:10:00DさんAさん
52018-12-01 12:10:00CさんBさん
42018-11-20 12:10:00AさんBさん
32018-11-10 12:10:00AさんCさん
22018-11-01 12:10:00AさんDさん
12018-10-21 12:10:00CさんAさん

抽出条件として
①Aさんがto_userまたはfrom_userに含まれる
②相手(Aさんでない方のカラム)の重複は除く
③それぞれdatの最新のもの

下記のようなデータを抽出したい

nodatto_userfrom_user
102018-12-31 12:10:00AさんBさん
72018-12-21 12:10:00CさんAさん
62018-12-11 12:10:00DさんAさん

試したquery

mysql

1SELECT v1.* FROM 2(SELECT *,to_user as myno FROM tableA WHERE no IN( SELECT MAX(no) FROM tableA WHERE from_user='Aさん' GROUP BY to_user) 3 UNION ALL SELECT *,from_user as myno FROM tableA WHERE no IN( SELECT MAX(no) FROM tableA WHERE to_user='Aさん' GROUP BY from_user )) AS v1 4GROUP bY myno 5ORDER BY v1.dat DESC

としたのですが、①②を満たすデータは取れるのですが③datが最新のものの抽出ができません。
「mysql group 最大値」と検索した結果にヒントはあると思うのですが
UNION で連結していることで複雑になりわからなかったので、質問しました。

mac
chrome
php7.X
mysql5.7

szk.👍を押しています

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

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

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

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

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

guest

回答3

0

実行してませんがこんな感じでいけると思います。
datがユニークでなければ読み替えてください。

SQL

1SELECT * FROM tableA t 2WHERE EXISTS ( 3 4 -- datがユニークの前提で結合 5 SELECT * FROM ( 6 7 -- Aさんの相手の重複を削除して最大のdatを取得 8 SELECT MAX(w.dat) AS max_dat FROM ( 9 10 -- Aさんを含むdatとAさんの相手を取得 11 SELECT 12 w.dat 13 , CASE w.to_user 14 WHEN 'Aさん' THEN w.from_user 15 ELSE w.to_user 16 END AS notA 17 FROM tableA w 18 WHERE to_user = 'Aさん' OR from_user = 'Aさん' 19 20 ) w2 21 GROUP BY w2.notA 22 23 ) w3 24 WHERE w3.max_dat = t.dat 25) 26

投稿2019/01/10 14:41

szk.

総合スコア1400

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

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

u-sukesan

2019/01/10 15:43

ありがとうございます。 Unknown column 'w.dat' in 'field list' となります。 カラム名はdatで間違いありません。
u-sukesan

2019/01/10 16:03

-- Aさんの相手の重複を削除して最大のdatを取得 SELECT MAX(w.dat) AS max_dat FROM ( -- Aさんの相手の重複を削除して最大のdatを取得 SELECT MAX(w2.dat) AS max_dat FROM ( とすることで回避できました!
u-sukesan

2019/01/10 16:07

ちなみに 別テーブル name age sex Bさん 20才 男 Cさん 30才 女 をnotA =nameでJOINする方法はありますでしょうか?
guest

0

こんな漢字で、

SQL

1SELECT 2 MAX(a2.no) AS no 3 ,a2.dat 4 ,a2.to_user 5 ,a2.from_user 6FROM 7 ( SELECT 8 MAX(a.dat) AS dat 9 ,a.to_user 10 ,a.from_user 11 FROM 12 tableA a 13 WHERE 14 a.to_user = 'Aさん' 15 OR a.from_user='Aさん' 16 GROUP BY 17 a.to_user 18 ,a.from_user 19 ) a1 JOIN tableA a2 ON 20 a1.dat = a2.dat 21 AND a1.to_user = a2.to_user 22 AND a1.from_user = a2.from_user 23GROUP BY 24 a2.dat 25 ,a2.to_user 26 ,a2.from_user 27ORDER BY 28 a2.dat DESC 29 ,a2.to_user 30 ,a2.from_user

投稿2019/01/10 13:43

hichon

総合スコア5737

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

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

u-sukesan

2019/01/11 01:14

ありがとうございます。 to_userに含まれるAさんと from_userに含まれるAさんのレコードがグループ化できていないようです。 Aさん Bさん Bさん Aさん
guest

0

ベストアンサー

  • 元データ

SQL

1create table tbl(no int,dat datetime,to_user varchar(20),from_user varchar(20)); 2insert into tbl values 3(10,'2018-12-31 12:10:00','Aさん','Bさん'), 4( 9,'2018-12-30 12:10:00','Bさん','Aさん'), 5( 8,'2018-12-30 11:10:00','Aさん','Bさん'), 6( 7,'2018-12-21 12:10:00','Cさん','Aさん'), 7( 6,'2018-12-11 12:10:00','Dさん','Aさん'), 8( 5,'2018-12-01 12:10:00','Cさん','Bさん'), 9( 4,'2018-11-20 12:10:00','Aさん','Bさん'), 10( 3,'2018-11-10 12:10:00','Aさん','Cさん'), 11( 2,'2018-11-01 12:10:00','Aさん','Dさん'), 12( 1,'2018-10-21 12:10:00','Cさん','Aさん');
  • 抽出

SQL

1select no,dat,elt(field('Aさん',to_user,from_user),from_user,to_user) as not_a 2from tbl as t1 3having not exists(select 1 4from tbl 5where 'Aさん' in(to_user,from_user) 6and elt(field('Aさん',to_user,from_user),from_user,to_user)=not_a 7and dat>t1.dat 8) 9and not_a is not null

追加

SQL

1create table user(name varchar(10),age int, sex set('男','女')); 2insert into user values 3('Bさん',20,'男'), 4('Cさん',30,'女');
  • ユーザー情報つき

SQL

1select * from ( 2select no,dat,elt(field('Aさん',to_user,from_user),from_user,to_user) as not_a 3from tbl as t1 4having not exists(select 1 5from tbl 6where 'Aさん' in(to_user,from_user) 7and elt(field('Aさん',to_user,from_user),from_user,to_user)=not_a 8and dat>t1.dat 9) 10and not_a is not null 11) 12as t2 13inner join user as t3 on t2.not_a=t3.name

※上記だとDさんがuserテーブルにないので消えてしまいます
ユーザー情報のないuserもnullで個人情報を表示したいなら
inner joinをleft joinに変えてください

投稿2019/01/11 00:44

編集2019/01/11 01:00
yambejp

総合スコア114505

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

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

u-sukesan

2019/01/11 00:50

いつもありがとうございます。 同じ結果を得られました。 ちなみにこれに 別テーブル name age sex Bさん 20才 男 Cさん 30才 女 をnot_a =nameでJOINする方法はありますでしょうか?
yambejp

2019/01/11 01:01

追記しました。 こういうのは単純にサブクエリーにしてしまうのが簡単です
u-sukesan

2019/01/11 01:08

理想の結果を得られました。 なるほど、最初のものをサブクエリかして、それにJOINするんですね 勉強になります。 またよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問