あなたのソリューションは、いくつかのフィールド(この場合はちょうど)でグループ化することを許可するGROUP BY 句の拡張をpost_author
利用します:
GROUP BY wp_posts.post_author
集計されていない列を選択します。
SELECT wp_posts.*
group by 句にリストされていない、または集計関数 (MIN、MAX、COUNT など) で使用されていないもの。
GROUP BY 句の拡張の正しい使用
これは、集計されていない列のすべての値がすべての行で等しい場合に便利です。
たとえば、GardensFlowers
(name
庭flower
で育つ、庭の)テーブルがあるとします。
INSERT INTO GardensFlowers VALUES
('Central Park', 'Magnolia'),
('Hyde Park', 'Tulip'),
('Gardens By The Bay', 'Peony'),
('Gardens By The Bay', 'Cherry Blossom');
複数の花が生育する庭で育つすべての花を抽出したいと考えています。次に、サブクエリを使用する必要があります。たとえば、次のように使用できます。
SELECT GardensFlowers.*
FROM GardensFlowers
WHERE name IN (SELECT name
FROM GardensFlowers
GROUP BY name
HAVING COUNT(DISTINCT flower)>1);
代わりに庭にある唯一の花をすべて抽出する必要がある場合は、 HAVING 条件を に変更するだけで済みますがHAVING COUNT(DISTINCT flower)=1
、MySql では次のように使用することもできます。
SELECT GardensFlowers.*
FROM GardensFlowers
GROUP BY name
HAVING COUNT(DISTINCT flower)=1;
サブクエリはなく、標準 SQL ではありませんが、より単純です。
GROUP BY 句の拡張の不適切な使用
しかし、すべての行が等しくない集計されていない列を SELECT するとどうなるでしょうか? MySql がその列に選択する値はどれですか?
MySql は常に、遭遇したFIRST値を選択するようです。
最初に検出した値が正確に目的の値であることを確認するにはGROUP BY
、順序付きクエリに a を適用する必要があるため、サブクエリを使用する必要があります。それ以外の場合はできません。
MySql が常に最初に遭遇した行を選択するという仮定を考えると、GROUP BY の前に行を正確にソートしていることになります。しかし、残念ながら、ドキュメントを注意深く読むと、この仮定が正しくないことに気付くでしょう。
常に同じではない集計されていない列を選択すると、MySql は任意の値を自由に選択できるため、実際に表示される結果の値は indeterminate になります。
集計されていない列の最初の値を取得するこのトリックが頻繁に使用されていることがわかります。通常/ほとんど常に機能します。私も時々使用します(自己責任で)。ただし、文書化されていないため、この動作に依存することはできません。
このリンク (ypercube に感謝します!) GROUP BY トリックが最適化されましたは、おそらく異なる最適化エンジンが原因で、同じクエリが MySql と MariaDB の間で異なる結果を返す状況を示しています。
したがって、このトリックが機能するかどうかは運次第です。
他の質問で受け入れられた答えは、 私には間違っているように見えます:
HAVING wp_posts.post_date = MAX(wp_posts.post_date)
wp_posts.post_date
post_date
は集計されていない列であり、その値は公式には未定ですが、最初に遭遇する可能性があります。しかし、GROUP BY トリックは順序付けされていないテーブルに適用されるため、どれが最初に検出されるかはわかりませんpost_date
。
おそらく、単一の作成者の唯一の投稿である投稿が返されますが、これも常に確実であるとは限りません。
可能な解決策
これが可能な解決策になると思います:
SELECT wp_posts.*
FROM wp_posts
WHERE id IN (
SELECT max(id)
FROM wp_posts
WHERE (post_author, post_date) = (
SELECT post_author, max(post_date)
FROM wp_posts
WHERE wp_posts.post_status='publish'
AND wp_posts.post_type='post'
GROUP BY post_author
) AND wp_posts.post_status='publish'
AND wp_posts.post_type='post'
GROUP BY post_author
)
内部クエリでは、すべての著者の最大投稿日を返しています。次に、同じ著者が理論的には同時に 2 つの投稿を行うことができるという事実を考慮しているため、最大 ID のみを取得しています。そして、それらの最大 ID を持つすべての行を返しています。IN 句の代わりに結合を使用して高速化できます。
(それID
が増加しているだけで、それID1 > ID2
も意味する場合post_date1 > post_date2
は、クエリをもっと簡単にすることができますが、そうであるかどうかはわかりません)。