
MySQL5とPHP7で検索システムを製作しています。
info_table
+---+-----+---
| id2 | name |・・・
+---+-----+---
| 1 | AAA | ・・・
| 2 | BBB | ・・・
| 3 | CCC | ・・・
+---+-----+---
list_table
+--+------+-----+-----+
| id | name2 | year | text |
+--+------+-----+-----+
| 1 | AAA | 2017 | あああ |
| 2 | BBB | 2017 | いいい |
| 3 | CCC | 2017 | ううう |
| 4 | AAA | 2017 | えええ |
| 5 | BBB | 2017 | おおお |
| 6 | AAA | 2018 | かかか |
| 7 | CCC | 2018 | ききき |
+--+------+-----+-----+
上記のような2つのテーブルを結合した後、「yearが2017」のレコードを検索。
その時にname2が重複した場合、idが一番大きいレコード以外を削除したいです。
さらに、ソートもできれば最高です。
理想とする結果
+--+------+-----+-----+---+-----+---
| id | name2 | year | text | id2 | name |・・・
+--+------+-----+-----+---+-----+---
| 3 | CCC | 2017 | ううう | 3 | CCC | ・・・
| 4 | AAA | 2017 | えええ | 1 | AAA | ・・・
| 5 | BBB | 2017 | おおお | 2 | BBB | ・・・
+--+------+-----+-----+---+-----+---
結合し検索する所までは出来たのですが、重複したレコードの削除で躓いてしまいました。
$sql = 'SELECT * FROM list_table LEFT JOIN info_table ON name = name2 WHERE year = "2017" ORDER BY id';
GROUP byを試しましたが、理想の検索結果にはなりませんでした。
良い方法をご教示頂ければ幸いです。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
> 検索結果の中から一番最新のレコードのみを表示したいので、削除で間違いありません。
DBに対する認識がちがうような・・・
削除はテーブルからデータを削除することですから、削除をすると
list_tableの中身のデータがなくなってしまうのですが大丈夫ですか?
ちなみにインデックスちゃんと貼っていますか?
info_tableはid2に主キーを設定してください
list_tableはidを主キーに、name2,yearをあわせて複合インデックスを設定してください
返信ありがとうございます。
勉強不足で申し訳ありません。
削除ではないですね。
条件で抽出した後、idが一番大きいレコードを残すという事です。
インデックスは主キー、複合インデックス共に設定しています。
No.2
- 回答日時:
とりあえずはこう
select * from list_table as t1
inner join info_table as t2 on t1.name2=t2.name
where exists(
select name2 from list_table
where year=2017
group by name2
having max(id)=t1.id
)
order by id
返信ありがとうございます。
検索結果の中から一番最新のレコードのみを表示したいので、削除で間違いありません。
書き忘れてしまい申し訳ないのですが、実際のinfo_tableには1万件ほど、list_tableには2万件ほどのレコードがあります。
yambejp様から頂いたコードを試したところ、理想の検索結果を取得できましたが、終了まで数分かかってしまいました。
検索時間を短くしたいのですが、何か良い方法はありますでしょうか?
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エクセルの関数について教えて...
-
よか石けんの口コミや評判
-
1テーブル&複数レコードの更新...
-
”photo id” とは何ぞや?
-
クエリ表示と、ADOで抽出したレ...
-
一つ前のレコードの値と減算し...
-
Unionした最後にGROUP BYを追加...
-
select文のwhere句に配列を入れ...
-
「SELECTして取得できない場合...
-
PL/SQLの変数について
-
mysqlのデータから連続する日数...
-
ストアドのエラーについて
-
NOT INをNOT EXISTSで書き直したい
-
ソート順の一番若い者を取得する
-
Updateの複数テーブル条件時のL...
-
INで抽出した順番に並び替え(S...
-
SQLサーバから、項目の属性(型...
-
inner joinをすると数がおかし...
-
ある条件の最大値+1を初番する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エクセルの関数について教えて...
-
VIEWの元のテーブルのindexって...
-
エラー 1068 (42000): 複数の主...
-
SQLサーバから、項目の属性(型...
-
select文のwhere句に配列を入れ...
-
SQL Left Join で重複を排除す...
-
Access パラメータクエリをcsv...
-
マイクラPC版のコマンドで効率...
-
【Transact-sql】 execの結果を...
-
sqlで、600行あるテーブルを100...
-
SQLにて特定の文字を除いた検索...
-
1テーブル&複数レコードの更新...
-
PL/SQLの変数について
-
WordpressのContact form 7でzi...
-
複数テーブルのGROUP BY の使い...
-
バインド変数について
-
inner joinをすると数がおかし...
-
MySQLのint型で001と表示する方...
-
updateを1行ずつ実行したい。
おすすめ情報