[解決済み] MySQL JOINは最新行のみ?
2022-07-11 08:51:30
質問
customer_id、email、referenceを保存するcustomerテーブルを持っています。追加のテーブルcustomer_dataがあり、顧客に加えられた変更の履歴レコードを保存します。
顧客情報をテーブルに表示するために、2つのテーブルを結合する必要がありますが、customer_dataから最新の行だけをcustomerテーブルに結合する必要があります。
クエリはページ分割されるため、リミットとオフセットがあり、少し複雑になります。
MySQLでこれを行うにはどうしたらよいでしょうか。どこかにDISTINCTを入れたいような気がするのですが...。
今のところ、クエリはこんな感じです。
SELECT *, CONCAT(title,' ',forename,' ',surname) AS name
FROM customer c
INNER JOIN customer_data d on c.customer_id=d.customer_id
WHERE name LIKE '%Smith%' LIMIT 10, 20
さらに、このようにLIKEでCONCATが使えると考えていいのでしょうか?
(INNER JOINが間違ったタイプのJOINである可能性があることは承知しています。実は、JOINの違いについては、全くわかりません。これから調べてみようと思います!)
どのように解決するのですか?
以下を試してみてください。
SELECT CONCAT(title, ' ', forename, ' ', surname) AS name
FROM customer c
JOIN (
SELECT MAX(id) max_id, customer_id
FROM customer_data
GROUP BY customer_id
) c_max ON (c_max.customer_id = c.customer_id)
JOIN customer_data cd ON (cd.id = c_max.max_id)
WHERE CONCAT(title, ' ', forename, ' ', surname) LIKE '%Smith%'
LIMIT 10, 20;
なお
JOIN
は単なる同義語で
INNER JOIN
.
テストケースです。
CREATE TABLE customer (customer_id int);
CREATE TABLE customer_data (
id int,
customer_id int,
title varchar(10),
forename varchar(10),
surname varchar(10)
);
INSERT INTO customer VALUES (1);
INSERT INTO customer VALUES (2);
INSERT INTO customer VALUES (3);
INSERT INTO customer_data VALUES (1, 1, 'Mr', 'Bobby', 'Smith');
INSERT INTO customer_data VALUES (2, 1, 'Mr', 'Bob', 'Smith');
INSERT INTO customer_data VALUES (3, 2, 'Mr', 'Jane', 'Green');
INSERT INTO customer_data VALUES (4, 2, 'Miss', 'Jane', 'Green');
INSERT INTO customer_data VALUES (5, 3, 'Dr', 'Jack', 'Black');
結果(クエリから
LIMIT
と
WHERE
):
SELECT CONCAT(title, ' ', forename, ' ', surname) AS name
FROM customer c
JOIN (
SELECT MAX(id) max_id, customer_id
FROM customer_data
GROUP BY customer_id
) c_max ON (c_max.customer_id = c.customer_id)
JOIN customer_data cd ON (cd.id = c_max.max_id);
+-----------------+
| name |
+-----------------+
| Mr Bob Smith |
| Miss Jane Green |
| Dr Jack Black |
+-----------------+
3 rows in set (0.00 sec)
関連
-
[解決済み】MySQL - オペランドは1つのカラムを含む必要があります。
-
[解決済み] SQLエラー。ORA-01861:リテラルは、フォーマット文字列01861に一致しません。
-
[解決済み] MySQLでdatetimeとtimestampのどちらのデータ型を使用すべきですか?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] SQL Server の DateTime データ型から日付だけを返す方法
-
[解決済み] 各GROUP BYグループの最初の行を選択しますか?
-
[解決済み] 各グループの最後のレコードを取得する - MySQL
-
[解決済み] 最初の行への結合方法
-
[解決済み] MySQLでFULL OUTER JOINを行うにはどうすればよいですか?
-
[解決済み】「INNER JOIN」と「OUTER JOIN」の違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】文字列からuniqueidentifierに変換する際に変換に失敗する - 2つのGUIDの場合
-
Mysql がエラーを報告 オペランドには 1 つのカラムが含まれている必要があります。
-
SQLException。オペランドは1列でなければなりません。
-
Djangoマイグレーションエラー 外部キー制約を追加できない
-
Mysqlデータベースへのリンク時にpymysqlがConnection refusedエラーを報告する
-
Unknown character set.を解決する。MySQLデータベースインポート時の'utf8mb4'エラーの解消
-
[解決済み] SQLを使用してSUMとSUBTRACTを行うには?
-
[解決済み] ブーリアン値を格納するために使用するMySQLデータ型
-
[解決済み] MySQLテーブルへの挿入または存在する場合の更新
-
[解決済み] MySQLで複数のカラムに一意制約を指定するには?