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

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

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

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

SQL

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

解決済

INNER JOIN の順序の通りに取得したい

nikuatsu
nikuatsu

総合スコア160

MySQL

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

SQL

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

2回答

0評価

0クリップ

257閲覧

投稿2022/06/15 13:55

編集2022/06/16 05:13

前提

MySQLで「指定色のフルーツを、いいね順で検索」する機能を実装しています。

実現したいこと

いいね順での取得を実現したいです。

発生している問題

いいね順という点が上手くできません。

該当のソースコード

こちらになりまして、「赤い色のフルーツ」の取得まではできているのですが、それが 1,6,8,10 という順序になってしまいます。

いいね順が目的なので、10,6,8,1 という順序にしたいのです。

サブクエリsearchedORDER BY fruits2.count_likes DESCをかけていいね順にしているのに、なぜでしょうか?

以下実行サンプル:http://sqlfiddle.com/#!9/52257e/2

SQL

CREATE TABLE my_fruits (`ID` int, `count_likes` int(100), `content` varchar(100)); INSERT INTO my_fruits (`ID`, `count_likes`, `content`) VALUES (1, 10, 'フルーツ1'), (2, 56, 'フルーツ2'), (3, 36, 'フルーツ3'), (4, 94, 'フルーツ4'), (5, 12, 'フルーツ5'), (6, 80, 'フルーツ6'), (7, 90, 'フルーツ7'), (8, 46, 'フルーツ8'), (9, 70, 'フルーツ9'), (10, 88, 'フルーツ10'); CREATE TABLE my_tags (`ID` int, `tag_kind_id` int, `tag_name` varchar(100)); INSERT INTO my_tags (`ID`, `tag_kind_id`, `tag_name`) VALUES (1, 1, '濃い赤'), (2, 1, '薄い青'), (3, 1, '明るい緑'), (4, 1, 'かわいいピンク'), (5, 1, '灰色'), (6, 1, '真っ青'), (7, 1, '薄い赤'), (8, 1, '暗黒'), (9, 1, '黄色'), (10, 1, '紫'), (11, 1, 'オレンジ'); CREATE TABLE my_tag_holders (`fruits_ID` int, `tags_ID` int); INSERT INTO my_tag_holders (`fruits_ID`, `tags_ID`) VALUES (1, 1),(1, 2),(1, 3), (2, 4),(2, 5),(2, 6),(2, 9), (3, 3), (4, 4),(4, 5),(4, 6), (5, 8), (6, 1),(6, 2),(6, 3), (7, 10), (8, 7),(8, 9), (9, 4),(9, 5),(9, 6), (10, 7),(10, 10);

SQL

SELECT fruits.ID AS fruits_id ,fruits.count_likes ,fruits.content ,GROUP_CONCAT( tags.tag_name ) AS tag_names FROM my_fruits fruits -- 赤い色のフルーツをいいね順で取得 INNER JOIN ( SELECT fruits2.ID FROM my_fruits fruits2 LEFT JOIN my_tag_holders th ON th.fruits_ID = fruits2.ID LEFT JOIN my_tags tags2 ON tags2.ID = th.tags_ID WHERE tags2.tag_name LIKE '%赤%' GROUP BY fruits2.ID ORDER BY fruits2.count_likes DESC, fruits2.ID DESC LIMIT 0, 20 ) AS searched ON searched.ID = fruits.ID LEFT JOIN my_tag_holders th ON th.fruits_ID = fruits.ID LEFT JOIN my_tags tags ON tags.ID = th.tags_ID GROUP BY searched.ID

試したこと

サブクエリの INNER JOIN の中身だけで実行すると、正しく 10,6,8,1 という順序になっていることが確認できました。(ならそれを INNER JOIN している上記クエリがなぜ 1,6,8,10 という順序になるのか疑問です。)

また次のように、INNER JOIN の結果にもう一度改めて ORDER BY をかける(35行目を追加する)ならば正しい順序となりましたが、しかし改めてかける点に違和感を覚えています。

SQL

34行目: GROUP BY searched.ID -- ↓INNER JOINの結果にもう一度改めてORDER BYをかける 34行目: GROUP BY searched.ID 35行目: ORDER BY fruits.count_likes DESC, fruits.ID DESC

改めて ORDER BY かけることなく、INNER JOIN の順序そのままに取得できないでしょうか?

補足情報

MySQL5.7 を利用しています。

(MySQL8.0 ならば「Join-Order オプティマイザヒント句」なるものが有効っぽい(?)というのは こちらの記事 で見つけたですが…)

追記

検索結果は上記のように INNER JOIN を用いてsearchedとして得たいです。
searchedを作らず、WHERE で取得する方法も試したのですが、それは取得に時間がかかったためです。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

MySQL

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

SQL

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