一排匹配他们所有

时间:2015-04-23 04:43:51

标签: mysql join

所以我有一个情况,我有两张桌子。一个是基表(在此示例中称为_Keys),具有唯一的主键。然后是另一个表,其中包含_Keys中每个id的多行数据(第二个表是Extra)。

我需要为Extra中的_Keys中的每个主键选择最大值。我已经建立了一个SQLFiddle来模拟问题here

这是我目前正在使用的查询,但问题是它只会为Extra表选择一个值,而不是每行一个值。

Select * from _Keys
LEFT JOIN
(Select * from Extra ORDER BY value2 DESC LIMIT 1) as e
ON e.id = _Keys.id;

对于我的示例SQL Fiddle,我使用了这个数据库模式:

CREATE TABLE _Keys(id int, value int);
INSERT INTO _Keys (id, value) VALUES (1, 5),(2, 3),(3, 4);

CREATE TABLE Extra(id int, value2 int);
INSERT INTO Extra (id, value2) VALUES (1, 3),(1, 1),(2, 4),(2, 6),(3, 3),(3, 5);

基本上我的结果是here。只有_Keys表中的第一行才能从第二个表中获取数据。

在MySQL中,如何为_Keys中的每一行从Extras中选择一行?

3 个答案:

答案 0 :(得分:1)

您可以使用更好的效果尝试此查询:

SELECT k.id, MAX(e.value2) AS value2
FROM _Keys k
INNER JOIN Extra e
ON (k.id = e.id)
GROUP BY k.id;

答案 1 :(得分:1)

由于LIMIT,您的联接表Select * from Extra ORDER BY value2 DESC LIMIT 1将只包含一行。试试这个:

Select * from _Keys
LEFT JOIN
(Select id, max(value2) from Extra group by id) as e
ON e.id = _Keys.id;

答案 2 :(得分:1)

我相信我明白你要做什么,但我不确定。

  • 由于NULL,您获得了LIMIT个值,它只返回第一行。您还需要使用GROUP BY
  • 要获得最大值,您可以使用MAX

试试这个。

SELECT * from _Keys
LEFT JOIN
(SELECT id, MAX(value2) AS value2 FROM Extra GROUP BY id) as e
ON e.id = _Keys.id;