0

我正在使用一个定期更新自身的系统,在这个系统中,我尝试选择最高的 500 个并列出它们。但是,问题是我通过包含 2013-07-08 格式的日期的 varchar 对其进行排序,这是一个遗物,暂时我不允许将其更改为适当的日期以便于排序.

我的问题是,我怎样才能只选择以下 3 个假装结果中的 1 个?

编号| 价值 | 所有者 | 日期

1| 21300 | 1       | 2013-07-08
2| 21300 | 1       | 2013-07-08
3| 21300 | 1       | 2013-07-08

我需要做的是从每个 ownerid 中选择一个条目,这是具有最高值的条目(如果都相同,则哪个条目并不重要,只是它只是一个!)

这是使用带有 PDO 作为数据库层的 mysql 数据库。

感谢任何和所有的帮助!

4

2 回答 2

0

使用带有 a 的子查询GROUP BY来获取每天的特定 id(例如最大或最小),然后JOIN针对表获取其余详细信息:

SELECT a.id, a.value, a.ownerid, a.date
FROM SomeTable a
INNER JOIN
(
    SELECT date, MAX(id) AS MaxId
    FROM SomeTable
    GROUP BY date
) b
ON a.date = b.date
AND a.id = b.MaxId

修改版本以获取每天的最高值行。由于值不是唯一的,我已经进行了进一步的子选择以获取该最高值的最高 id。如果没有这个,您可能会在一天内返回多行。如果其他值每个不同的可能性为零,则可以使用 DISTINCT 删除倍数,但通常无法确定这一点。

SELECT a.id, a.`value`, a.ownerid, a.`date`
FROM SomeTable a
INNER JOIN
(
    SELECT `date`, MAX(`value`) AS MaxVal
    FROM SomeTable
    GROUP BY `date`
) b
ON a.`date` = b.`date`
AND a.`value` = b.MaxVal
INNER JOIN
(
    SELECT `date`, `value`, MAX(id) AS MaxId
    FROM SomeTable
    GROUP BY `date`, `value`
) c
ON b.`date` = c.`date`
AND b.MaxVal = c.`value`
AND a.id = c.MaxId
于 2013-07-08T11:33:10.060 回答
0
SELECT * 
FROM [table] 
ORDER BY STR_TO_DATE(yourdatefield, '%m/%d/%Y') DESC 
LIMIT 5
于 2013-07-08T11:36:06.783 回答