【问题标题】:PHP / MYSQL - How to select only the most recent value for each different valuePHP / MYSQL - 如何为每个不同的值只选择最近的值
【发布时间】:2014-01-10 15:07:50
【问题描述】:

我是法国人,英语不太流利,所以我会尽量说清楚。

我有带有 ID、CODE、value1、value2 和 Date 的“我的表”

我尝试仅获取每个唯一代码的最新日期,代码的 1 个结果

有了这个请求,它什么也不显示:

$sql = 'SELECT value1, value2,Date 
FROM 'my table' 
GROUP BY CODE 
HAVING Date = MAX(Date) 
ORDER BY CODE ASC';

有人帮帮我吗?

谢谢。

编辑:

我的桌子是 Geoloc

> ID    IMEI    Latitude    Longitude   Date
6   24047780 49.027063  1.147213    2014-01-02 11:19:45
8   24047780 48.738078  1.366940    2014-01-02 11:20:31
9   24048781 48.864715  2.350216    2014-01-02 12:23:12
10  24048781 48.8686132 2.3572024   2014-01-07 16:06:40
11  24048783 49.027063  1.147213    2014-01-07 16:07:45

我想通过imei显示一个结果,最近的。

EDIT2:我正在使用

$sql4 = 'SELECT `ID`, `IMEI`, `LATITUDE`, `LONGITUDE`, `DATE`
FROM (SELECT *, 
IF(@lastId = @lastId:=IMEI, @Idx:=@Idx+1, @Idx:=0) rowNumber 
FROM `Geoloc` l, (SELECT @lastId:=0, @Idx:=0) A
ORDER BY `imei` DESC, `date` DESC
) AS A
WHERE rowNumber = 0 ';
// on envoie la requête 
$req4 = mysql_query($sql4) or die('Erreur SQL !<br>'.$sql4.'<br>'.mysql_error());
//the script i use to display informations
while( $Geoloc = mysql_fetch_assoc($req4)) 
            {
            $array[] = "new google.maps.LatLng(".$Geoloc['Latitude']." , ".$Geoloc['Longitude'].") " ;
            $marqueurs[] = 
            "// affichage du marqueur_".$i." - start 
            var marker_".$i."=new google.maps.Marker({position:".$array[$i].",});
            marker_".$i.".setMap(map);
            var infowindow_".$i." = new google.maps.InfoWindow({content:\"".$Geoloc['Date']." - ".$Geoloc['IMEI']." - \"});
            google.maps.event.addListener(marker_".$i.", 'click', function() {infowindow_".$i.".open(map,marker_".$i.");});
    // affichage du marqueur_".$i." - end \n
            ";
            $i++ ;
            }

这个sql请求,纬度和经度不显示,aziz给出的sql请求显示,但是如果1个imei的2个最大日期相同,则显示两者

EDIT3:没关系,CAPS 有问题,谢谢 TUN

【问题讨论】:

  • 我们可以看看您的表格值和所需的输出吗?
  • 不要将表名括在引号中。使用反引号
  • 是否也要对应的value1和value2?
  • @SalmanA 是的,我想使用 value1 和 value2 作为对应的结果
  • 如果您的实际表格名为my table,您需要在其周围使用反引号,原因有几个。 1)最好在表名周围使用反引号而不是引号(这会导致错误)和 2)两个单词之间有空格。只是一个快速的“仅供参考”;-)

标签: php mysql select


【解决方案1】:

试试这个:

SELECT t.* 
FROM table1 t
JOIN (
  SELECT MAX(`date`) as maxdate, code
  FROM table1
  GROUP BY code
) t1
ON t.code = t1.code AND t.`date` = t1.maxdate
ORDER BY code

对于每个代码,您获取MAX 日期,然后将此内部表与您的主表连接起来以获取所需的记录。

如果您的数据中有重复的代码对和 maxdate,则在 JOIN 中也使用最大 ID,如下所示:

SELECT t.* 
FROM table1 t
JOIN (
  SELECT MAX(`id`) as `id`, MAX(`date`) as maxdate, code
  FROM table1
  GROUP BY code
) t1
ON t.code = t1.code AND t.`date` = t1.maxdate AND t.`id` = t1.`id`
ORDER BY code

【讨论】:

  • 就是这样,非常感谢,我会尽力理解你现在回答
  • @user3176950 欢迎您。我试图非常简要地解释它,但如果您对其工作有任何具体问题,请告诉我,我会尝试进一步解释。
  • 如果相同的imei,我们有相同的时间戳,如何只显示一个结果。
【解决方案2】:
SELECT `ID`, `IMEI`, `LATITUDE`, `LONGITUDE`, `DATE`
      FROM (SELECT *, 
                   IF(@lastId = @lastId:=IMEI, @Idx:=@Idx+1, @Idx:=0) rowNumber 
            FROM `my table` l, (SELECT @lastId:=0, @Idx:=0) A
            ORDER BY `imei` DESC, `date` DESC
           ) AS A
WHERE rowNumber = 0 

试试 SQL Fiddle

【讨论】:

  • 哇,这是我第一次看到那种 sql 代码,你的链接真的很酷。谢谢
  • 如果我想在结果中使用经纬度,怎么办?
  • “使用经纬度”是什么意思?结果显示IDIMEILATITUDELONGITUDEDATE。不是吗?
【解决方案3】:

这个对应你想做什么?

$sql = 'SELECT value1, value2,Date
FROM 'my table' 
GROUP BY CODE  
ORDER BY DATE DESC, CODE ASC';

【讨论】:

  • 这不会产生预期的结果。即使这样做,也不能保证它总是会产生预期的结果。
  • 不要将表名括在引号中。使用反引号 .. 这会给你一个语法错误,因为字符串没有正确转义
  • 语法无效。仔细检查
  • 你说对了。实际上(或更多)原因有两个,但你知道 ;-) @웃웃웃웃웃 “不要将表名括在引号中。使用反引号 .. 这会给你一个语法错误,因为字符串没有正确转义"
【解决方案4】:

试试这个查询

$sql = 'SELECT value1, value2, MAX(Date) 
FROM `my table` 
GROUP BY 
value1, value2
ORDER BY value1, value2;

【讨论】:

    猜你喜欢
    • 2021-02-27
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 2021-07-17
    • 2014-11-19
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多