-1

我需要在 GROUP BY 子句之前进行排序,但是 MySQL 不想配合。

SELECT `article`, `date`, `aip`
FROM `official_prices`
WHERE `article` = 2003
GROUP BY `article`
ORDER BY `date` ASC

应该选择的行是日期最早的行 (2013-07-15),但它会选择按表顺序排在第一位的日期。更改为DESC没有区别。

第一张图片显示了两行,未分组。第二张图片是他们被分组。

在此处输入图像描述

这个表是由一个主查询连接的,所以(我认为)任何涉及的解决方案LIMIT 1对我都没有用。

完整查询:

SELECT `articles`.*, `official_prices`.`aip`
FROM `articles`
LEFT JOIN `official_prices`
ON (`official_prices`.`article` = `articles`.`id`)
GROUP BY `articles`.`id`, `official_prices`.`article`
ORDER BY `official_prices`.`date` ASC, `articles`.`name`
4

2 回答 2

2

你不能使用group byorder喜欢那样。该顺序仅适用于返回的完整记录集,而不适用于组本身。这将起作用:

select o1.* 
from official_prices o1
inner join
(
  SELECT `article`, min(`date`) as mdate
  from `official_prices`
  WHERE `article` = 2003
  GROUP BY `article`
) o2 on o1.article = o2.article and o1.date = o2.mdate
于 2013-08-03T22:01:05.300 回答
1

你试图做的是完全不正确的。之前的排序对group by结果没有(保证)影响。

我的猜测是您想获得该日期dateaip最新信息。这是一个更好的方法:

SELECT `article`, max(`date`),
       substring_index(group_concat(`aip` order by date desc), ',', 1) as lastAip
FROM `official_prices`
WHERE `article` = 2003
GROUP BY `article`;

唯一的缺点是group_concat()会将任何值转换为字符串。如果是其他类型(并且字符串会造成问题),则将其转换回所需的类型。

实际上,更好的方法是group by完全跳过,因为您已经过滤到一篇文章:

select article, `date`, aip
from official_prices
where article = 2003
order by `date` desc
limit 1;

第一种方法适用于多篇文章。

编辑:

您的完整查询是:

SELECT `articles`.*, `official_prices`.`aip`
FROM `articles` LEFT JOIN
     `official_prices`
     ON `official_prices`.`article` = `articles`.`id`
GROUP BY `articles`.`id`, `official_prices`.`article`
ORDER BY `official_prices`.`date` ASC, `articles`.`name`;

您要查找的文章不止一篇,因此第二种方法不起作用。所以,使用第一个:

SELECT `articles`.*,
       substring_index(group_concat(`official_prices`.`aip` order by `official_prices`.`date` desc),
                       ',', 1) as lastAIP
FROM `articles` LEFT JOIN
     `official_prices`
     ON `official_prices`.`article` = `articles`.`id`
GROUP BY `articles`.`id`, `official_prices`.`article`
ORDER BY `articles`.`name`;
于 2013-08-03T22:00:59.547 回答