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
によって生成された行 、ほとんどの場合、ソーステーブルのどの行とも一致しません。
この回答 で問題の可能な解決策を見つけることができます 。アイデアを読んで理解した後、自分でクエリを作成する必要があります(そして、「勝者」の行をどのように選択するかが非常に明確になります)。