SELECT * FROM my_table GROUP BY section_identifier
無効なSQLです クエリ。
どのようにGROUPBY 動作しますか?
上記のクエリを取得して、 GROUP BYの方法を見てみましょう。 動作します。最初に、データベースエンジンは、 WHEREに一致するすべての行を選択します 句。 WHEREはありません このクエリの句。これは、テーブルのすべての行が結果セットの生成に使用されることを意味します。
次に、 GROUP BYで指定された式を使用して行をグループ化します。 条項:
+----+--------------------+----------------------+----------+
| id | section_identifier | option_identifier | store_id |
+----+--------------------+----------------------+----------+
| 17 | header | header_option_one | 1 |
| 23 | header | header_option_three | 0 |
+----+--------------------+----------------------+----------+
| 18 | footer | footer_option_one | 0 |
+----+--------------------+----------------------+----------+
| 19 | homepage_feature | homepage_feature_one | 0 |
| 25 | homepage_feature | homepage_feature_one | 1 |
+----+--------------------+----------------------+----------+
すべてを明確にするために、上記のリストでグループにマークを付けました。
次のステップでは、各グループからデータベースエンジンが単一の行を生成します。 。しかし、どうやって?
SELECT クエリの句はSELECT*です 。 *コード> テーブル列の完全なリストを表します。この場合、 SELECT * 書くための短い方法です:
SELECT id, section_identifier, option_identifier, store_id
列idの値を分析してみましょう 最初のグループのために。データベースエンジンがidに選択する値 ? 17 または23 ?なぜ17 なぜ23 ?
17を支持する基準はありません 23以上 。それらの1つを選択するだけです(おそらく 17 しかし、これは多くの内部要因に依存します)そして1つになります。
section_identifierの値を決定するのに問題はありません 。 GROUP BYに使用される列です 、グループ内のすべての値は等しい。
選択のジレンマは、列 option_identifierで再び発生します およびstore_id 。
標準のSQLによると クエリは無効であり、実行できません。ただし、一部のデータベースエンジンは、上記のように実行します。そうでない式の値(以下の少なくとも1つ):
-
GROUP BYで使用 条項; -
GROUPBY<で使用/ code> 集計関数SELECTで 条項; -
GROUP BYで使用される列に機能的に依存します 条項;
不確定です。
バージョン5.7.5以降 、 MySQL 関数従属性検出
を実装します デフォルトでは、無効な GROUP BYを拒否します あなたのようなクエリ。
それを機能させる方法
結果セットをどのように取得したいかは私にはわかりません。とにかく、テーブルからいくつかの行を取得したい場合は、 GROUP BY そうではありません それを行う正しい方法。 GROUP BY しません テーブルから行を選択すると、テーブルの値を使用して新しい値が生成されます。 GROUP BYによって生成された行 、ほとんどの場合、ソーステーブルのどの行とも一致しません。
この回答 で問題の可能な解決策を見つけることができます 。アイデアを読んで理解した後、自分でクエリを作成する必要があります(そして、「勝者」の行をどのように選択するかが非常に明確になります)。