1

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

SELECT *
FROM `node`
LEFT JOIN `choice` ON node.nid = choice.nid
4

2 に答える 2

2
SELECT *
  FROM node
  LEFT JOIN choice c USING (nid)
 WHERE (c.nid, c.foo) IN (SELECT nid, max(foo) FROM choice GROUP BY nid);

SQLFiddleで試してみてください


編集:

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ことをお勧めします。それ以外の場合は、全体的なアプローチを変更する必要があります。

于 2012-05-05T06:17:23.357 に答える
1

次のような結合を使用すると、これを非常に効率的に実現できます。

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 が重複するレコードがある場合、レコードが重複することです。

于 2012-05-05T05:01:33.480 に答える