次のクエリを変更して、フィールドの値が最も高いchoice行ごとに 1 行のみに追加を制限するにはどうすればよいですか? つまり、同じ を持つテーブルに複数の行があり、それぞれの最高のものを に結合したいと考えています。nidfoochoicenidfoonidnode
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 が重複するレコードがある場合、レコードが重複することです。