0

这个问题很难量化,所以我第一次可能没有正确措辞这个问题。

我有一个类似于以下格式的表格:

| id | other_id | timestamp  |
|  1 |        1 | 2012-01-01 |
|  2 |        1 | 2012-01-02 |
|  3 |        2 | 2012-01-02 |

我正在尝试做的是,给定“id”为 2 的记录和类似的记录,其中“id”列值是已知的并且是唯一的,并且“other_id”已知与之对应,我该如何找到,对于每一个,记录的“id”具有相同的“other_id”,但第一个低于我已知的“id”。

例如

$arrKnownIds = array (
 0 => array('id'=>2,'other_id'=>1),
 1 => array('id'=>3,'other_id'=>2)
);

有了这些信息,我想运行一个查询,结果如下:

while($row = mysql_fetch_assoc($result)) {
 $arrPreviousIds[$row['other_id']] = $row['id'];
 // having in this case values of:
 // $row['other_id'] = 2;
 // $row['id'] = 1;
}

如果我需要使用 UNION、多个 php 查询语句或是否有其他方法来解决这个问题,我无法完全确定。

任何关于如何解决这个问题的想法都非常感谢。

谢谢 :)

编辑- 原始查询采用以下形式:

SELECT DISTINCT(`other_id`), MAX(`id`), MAX(`timestamp`)
FROM `event`
GROUP BY `other_id`
ORDER BY `id` DESC, `other_id` ASC
LIMIT 0, 10

// 这旨在获取最后 10 个唯一事件并查找它们发生的时间。

// 由此,我然后尝试查找它们之前发生的时间。

4

1 回答 1

1

这个怎么样?

SELECT t1.id, (SELECT id
               FROM tbl t2
               WHERE t2.other_id = t1.other_id
               AND t2.id < t1.id
               ORDER BY t2.id DESC
               LIMIT 1)
FROM tbl t1
WHERE t1.id IN (1,2,3)

如果您要处理大型结果集,有更有效的方法可以做到这一点。你能解释一下你将如何使用这个查询吗?

更新- 基于将现有查询添加到此处的问题是一个更新的查询,将两者结合起来 -

SELECT tmp.*, (SELECT `timestamp`
               FROM `event`
               WHERE `event`.`other_id` = `tmp`.`other_id`
               AND `event`.`id` < `tmp`.`id`
               ORDER BY `event`.`id` DESC
               LIMIT 1) AS `prev_timestamp`
FROM (
    SELECT `other_id`, MAX(`id`) AS `id`, MAX(`timestamp`) AS `timestamp`
    FROM `event`
    GROUP BY `other_id`
    ORDER BY `id` DESC, `other_id` ASC
    LIMIT 0, 10
) tmp

我没有尝试过,但它应该会给出预期的结果。

于 2012-04-13T21:22:46.293 回答