1

如何修改以下查询以将添加限制为choice每行仅一行nid,即字段中具有最高值的行foo?也就是说,表中有多行choice具有相同的nid,我希望将foo每行中的最高nid连接到node

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 的“扩展”(我个人认为它容易出错)允许你做这样的事情。我假设 MySQLMAX(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

这种方法的一个缺点是,如果你有重复 foo 的记录,你会得到重复的记录。

于 2012-05-05T05:01:33.480 回答