如何在联接中获得单个记录?

时间:2018-06-09 15:35:07

标签: mysql sql greatest-n-per-group

我有一个名为fixtures的表,其中包含以下结构:

id | comp_id  | round_id | 
 1     10         11          
 2     10         12         
 3     10         11          

我想只获得一个“round_id”的结果,所以最终的结果应该是:1,3或2

我提出了这个问题:

SELECT *
 from fixtures f 
  LEFT 
  JOIN rounds r 
    ON r.id = (SELECT MIN(id) FROM rounds WHERE id = f.round_id)
WHERE comp_id = 10

但是这将返回所有可用的灯具记录,我需要返回一个单轮的灯具,我不知道这个号码。

-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `rounds` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `round_id` INT NULL,
  `season_id` INT NOT NULL,
  `name` VARCHAR(255) NULL,
  `link` VARCHAR(255) NULL,
  PRIMARY KEY (`id`),
 ENGINE = InnoDB;

4 个答案:

答案 0 :(得分:1)

仅选择具有fixtures 中使用的最小轮ID 的灯具(不是id中的最小rounds,因为这可能不会被使用在fixtures!)。

SELECT *
       FROM fixtures f
       WHERE f.round_id = (SELECT min(ff.round_id)
                                  FROM fixtures ff);

如果您还想要其中的圆形数据(我无法判断您是否在查询中加入,因为您想要圆形数据,或者这只是因为您尝试过滤),您可以加入rounds

SELECT *
       FROM fixtures f
            INNER JOIN rounds r
                       ON r.id = f.round_id
       WHERE f.round_id = (SELECT min(ff.round_id)
                                  FROM fixtures ff);

当然min()可以替换为其他一些合适的功能(例如max()),或者你可以提出一个完全不同的想法如何从{{{{}}获得一个round_id 1}}使用。重要的是,它必须是一个ID,并且必须在fixtures中使用。

答案 1 :(得分:0)

如果您只想要一条记录并且您并不真正关心哪条记录,请将LIMIT 1附加到查询的末尾。

答案 2 :(得分:0)

尝试使用群组声明

  SELECT *
 from fixtures f 
  LEFT 
  JOIN rounds r 
    ON r.id = (SELECT MIN(id) FROM rounds WHERE id = f.round_id)
WHERE comp_id = 10
GROUP BY r.round_id

答案 3 :(得分:0)

  

所以最终结果应该是:1,3或2

应用order by子句将以这种方式获取结果:

Select id from fixtures f
where f.round_id 
order by round_id asc;
  

只返回一轮的固定装置

为该where子句赋予相等条件以获取单轮 示例:

Select id from fixtures f
where f.round_id = 11
order by round_id asc;

^返回' id'和第1行和第3行,它们与round_id 11相关联。