次のクエリを変更して、フィールドの値が最も高いchoice
行ごとに 1 行のみに追加を制限するにはどうすればよいですか? つまり、同じ を持つテーブルに複数の行があり、それぞれの最高のものを に結合したいと考えています。nid
foo
choice
nid
foo
nid
node
SELECT *
FROM `node`
LEFT JOIN `choice` ON node.nid = choice.nid
SELECT *
FROM node
LEFT JOIN choice c USING (nid)
WHERE (c.nid, c.foo) IN (SELECT nid, max(foo) FROM choice GROUP BY nid);
編集:
bar
リストに追加する試合を話す。
サブクエリではMAX(foo)
、それぞれについて検索しているnid
ので、GROUP BY nid
。そのまま追加するロジックはありません。bar
その列で集計を使用するか、に含める必要がありGROUP BY
ます。このようなことを可能にするのは、MySQLの「拡張機能」(私は個人的にエラーが発生しやすいと思います)です。MySQLはMAX(bar)
舞台裏でやっていると思います。クエリを実行する場合:
mysql> SELECT nid, max(foo), max(bar) FROM choice GROUP BY nid;
+------+----------+------+
| nid | max(foo) | bar |
+------+----------+------+
| 1 | 3 | Uno |
| 2 | 1 | Eins |
+------+----------+------+
ご覧のとおりMAX(foo)
、これMAX(bar)
は別の行から取得されます。出力を次のものと比較します。
SELECT nid, max(foo), bar FROM choice GROUP BY nid;
nid
+foo
の組み合わせが一意になるとすぐに、サブクエリに値を追加しないchoice
ことをお勧めします。それ以外の場合は、全体的なアプローチを変更する必要があります。
次のような結合を使用すると、これを非常に効率的に実現できます。
SELECT *
FROM node
LEFT JOIN choice c1
ON c1.nid = node.nid
LEFT JOIN choice c2
ON c2.nid = node.nid
AND c2.foo > c1.foo
WHERE c2.foo IS NULL
この方法の 1 つの欠点は、foo が重複するレコードがある場合、レコードが重複することです。