mysql - 在以下给定条件下从选择查询中获取最新更改

标签 mysql select greatest-n-per-group

我有一个表结构为

id, trackid, table_name, operation, oldvalue, newvalue, field, changedonetime

现在如果我有 3 行相同的“trackid”相同的“字段”,那么我如何从三行中选择最新的?

即例如:

id = 100 trackid = 152 table_name = jos_menu operation= UPDATE oldvalue = IPL newvalue = IPLcccc field = name live = 0 changedonetime = 2010-04-30 17:54:39

id = 101 trackid = 152 table_name = jos_menu operation= UPDATE oldvalue = IPLcccc newvalue = IPL2222 field = name live = 0 changedonetime = 2010-04-30 18:54:39

如您所见,第二个条目是最新的更改, 现在我应该使用什么查询来从许多这样的行中获取唯一的一行和最新的行...

$distupdqry = "select DISTINCT trackid,table_name from jos_audittrail where live = 0 AND operation = 'UPDATE'";
$disupdsel = mysql_query($distupdqry);
$t_ids = array();
$t_table = array();
while($row3 = mysql_fetch_array($disupdsel))
{ 
 $t_ids[] = $row3['trackid'];
 $t_table[] = $row3['table_name'];
 //$t_table[] = $row3['table_name'];
}

//echo "<pre>";print_r($t_table);echo "<pre>";

//exit;
for($n=0;$n<count($t_ids);$n++)
{

   $qupd = "SELECT * FROM jos_audittrail WHERE operation = 'UPDATE'  AND trackid=$t_ids[$n] order by changedone DESC ";
 $seletupdaudit = mysql_query($qupd);
 $row4 = array();
 $audit3 = array();
 while($row4 = mysql_fetch_array($seletupdaudit))
 { 
  $audit3[] = $row4; 
 }   


  $updatefield = '';
  for($j=0;$j<count($audit3);$j++)
  {
   if($j == 0)
   {

    if($audit3[$j]['operation'] == "UPDATE")
    {
       //$insqry .= $audit2[$i]['operation']." ";
       //echo "<br>";
     $updatefield .= "UPDATE `".$audit3[$j]['table_name']."` SET ";

    }
   }

   if($audit3[$j]['operation'] == "UPDATE")
   {

    $updatefield .= $audit3[$j]['field']." = '".$audit3[$j]['newvalue']."', ";

   }

  }
  /*echo "<pre>";
 print_r($audit3);
 exit;*/
  $primarykey = "SHOW INDEXES FROM `".$t_table[$n]."` WHERE Key_name = 'PRIMARY'";
  $prime = mysql_query($primarykey);
  $pkey = mysql_fetch_array($prime);
  $updatefield .= "]";
     echo $updatefield = str_replace(", ]"," WHERE ".$pkey['Column_name']." = '".$t_ids[$n]."'",$updatefield); 
}

在上面的代码中,我正在获取完成更新操作的不同 ID,然后相应地触发查询以获取对所选不同 ID 的不同字段完成的所有更改... 在这里,我通过从最初描述的表中获取记录来创建更新查询,该表在此处被称为 audittrail 表... 因此,我需要该字段中的最后一次更改,以便在我使用的选择查询中只能选择最新更改...

请检查代码..看看我如何才能做出我最终需要的必要更改..

最佳答案

这是 greatest-n-per-group 类别的另一个问题,每周在 Stack Overflow 上出现几次。

以下是我在您的情况下的解决方法:

SELECT j1.*
FROM jos_audittrail j1 LEFT OUTER JOIN jos_audittrail j2
  ON (j1.trackid = j2.trackid AND j1.field = j2.field 
  AND j1.changedonetime < j2.changedonetime)
WHERE j2.id IS NULL;

关于mysql - 在以下给定条件下从选择查询中获取最新更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2756370/

相关文章:

php - PDO 语句不适用于 LIKE

mysql - 选择连接输出不完全匹配 [MySQL]

mysql - 错误 #1442 MySQL - 创建触发器

php - 从数据库中选择一个值

MYSQL:将数据批量更新到现有表中

sql - ACCESS 2010 SQL——在 SELECT TOP 子查询字段上使用 WHERE IN

javascript - Select - Angular 2 的设定值

SQL Left Join 仅第一个匹配项

mysql - 如何获得每组的最大行数?

mySQL查询分组记录的前N个条目