MySQL PDO-使用联接分组的表的最新行

MySQL PDO-使用联接分组的表的最新行,mysql,pdo,group-by,sql-order-by,greatest-n-per-group,Mysql,Pdo,Group By,Sql Order By,Greatest N Per Group,我为标题描述道歉,因为我不确定如何最好地描述这个 有多台计算机,每台计算机有多个用户,每个用户有多个数据日志。我想获得每台计算机的最新数据日志 我现在意识到,下面的查询没有提供正确的数据,因为ORDER BY用于结果,而GROUP BY没有特定的顺序 在发布之前,我确实读过这篇文章,似乎需要一个子查询,然后在同一个表上再次连接该子查询的结果,以获取该行的其余列值(发现的是最新的)。不过,我发现的示例非常基本,不涉及其他表的连接。似乎我也必须这样做两次,因为我希望它由计算机分组。。。(一次用于按用

我为标题描述道歉,因为我不确定如何最好地描述这个

有多台计算机,每台计算机有多个用户,每个用户有多个数据日志。我想获得每台计算机的最新数据日志

我现在意识到,下面的查询没有提供正确的数据,因为ORDER BY用于结果,而GROUP BY没有特定的顺序

在发布之前,我确实读过这篇文章,似乎需要一个子查询,然后在同一个表上再次连接该子查询的结果,以获取该行的其余列值(发现的是最新的)。不过,我发现的示例非常基本,不涉及其他表的连接。似乎我也必须这样做两次,因为我希望它由计算机分组。。。(一次用于按用户id分组的数据日志,并获得最大值,然后另一次按计算机id分组,以获得早期结果的最大值),或者可能我错了

需要一些帮助来掌握如何解决这个问题和方法

$stmt = $db->prepare("
    SELECT
        computers.computer_name,
        users.username,
        data_logs.window_title,
        data_logs.filename,
        data_logs.capture_timestamp
    FROM computers
    INNER JOIN users
        ON users.computer_id = computers.computer_id
    INNER JOIN data_logs
        ON data_logs.user_id = users.user_id AND data_logs.marked != 1
    WHERE computers.account_id = :cw_account_id AND computers.status = 1
    GROUP BY computers.computer_id
    ORDER BY data_logs.capture_timestamp desc
");

$binding = array('cw_account_id' => 1721);
$stmt->execute($binding);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);

echo "<pre>";
print_r($results);
echo "</pre>";
$stmt=$db->prepare(“
挑选
computers.computer\u name,
users.username,
数据日志。窗口标题,
data_logs.filename,
数据\u日志。捕获\u时间戳
来自计算机
内部加入用户
ON users.computer\u id=computers.computer\u id
内部连接数据日志
在data_logs.user_id=users.user_id和data_logs.marked!=1上
其中computers.account\u id=:cw\u account\u id和computers.status=1
按计算机分组。计算机\u id
按数据排序\u日志。捕获\u时间戳描述
");
$binding=array('cw\u account\u id'=>1721);
$stmt->execute($binding);
$results=$stmt->fetchAll(PDO::FETCH_ASSOC);
回声“;
打印(结果);
回声“;

一种解决方案是使用相关子查询。其原理是不聚合外部查询,但它在
WHERE
子句中有一个条件,该条件使用聚合子查询为当前计算机id选择最新的日志条目

我猜您需要这个查询(虽然没有看到示例数据和预期输出,但这可能不是100%准确):


可以有多台计算机,每台计算机有多个用户,每个用户有多个数据日志。从这里我可以看到,它只选择一条记录,而不是为提供的特定“帐户”(:cw\u account\u id)选择每台计算机一条记录。我收回这一点。。。看起来这是从每台计算机中提取正确信息的最新版本。将需要使用实时数据对此进行更多测试并比较结果,但我希望到目前为止:)@user756659:我更新了子查询以包含帐户_id上的筛选器。这是否必要,因为它已列为where语句的第一项?是的@user756659我相信这是必要的,子查询必须与外部查询关联。。。。你能测试一下这个查询并告诉我它是否适合你吗?
SELECT
    computers.computer_name,
    users.username,
    data_logs.window_title,
    data_logs.filename,
    data_logs.capture_timestamp
FROM computers
INNER JOIN users
    ON users.computer_id = computers.computer_id
INNER JOIN data_logs
    ON data_logs.user_id = users.user_id AND data_logs.marked != 1
WHERE 
    computers.account_id = :cw_account_id 
    AND computers.status = 1
    AND data_logs.capture_timestamp = (
        SELECT MAX(d.capture_timestamp)
        FROM computers c
                INNER JOIN users u ON u.computer_id = c.computer_id
        INNER JOIN data_logs d ON d.user_id = u.user_id AND d.marked != 1
        WHERE c.computer_id = computers.computer_id AND c.account_id = computers.account_id
    )
ORDER BY data_logs.capture_timestamp desc