如何修改以下查询以将添加限制为choice
每行仅一行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 的“扩展”(我个人认为它容易出错)允许你做这样的事情。我假设 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
我建议不要在子查询中添加更多值。否则需要改变整体方法。
您可以通过这样的连接非常有效地完成此操作:
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 的记录,你会得到重复的记录。