2012-04-13 65 views
0

这个数字很难量化,所以我可能不会第一次有这个问题。在mysql中选择多个条件的记录

我有一个表如下类似这样的格式:

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

什么,我试图做的是,由于与“ID” 2,以及类似的记录的记录,为此,“ID”列价值是已知的,是唯一的,'other_id'是已知的与它相对应的,我如何找到每个具有相同'other_id'的记录的'id',但是第一个低于'id'的记录比我已经知道。

E.g.

$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个独特的事件,并找到他们时有发生。

//从此,我然后尝试找出他们以前发生过的事情。

+0

我不知道我明白你想要什么。鉴于id 2,它应该返回id 1,因为它是other_id = 1时小于2的最高id。那是正确的吗?所以,鉴于ID 3应该返回null,因为没有更低的ID与other_id = 2? – nnichols 2012-04-13 21:13:39

+0

@nnichols,是的 - 你说的完全正确。 – MyStream 2012-04-13 21:14:50

回答

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) 

如果您要处理较大的结果集,那么有更高效的方法来做到这一点。你能解释你将如何使用这个查询吗?

UPDATE - 基于现有的除查询到这里的问题是一个更新的查询将二者结合起来 -

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 

我还没有试过,但它应该得到期望的结果。

+0

是的,我正在做的是寻找在特定时间被记录的特定事件,这些特定事件填充第一个数组,然后回顾时间以查看先前事件发生的时间,因此我可以指出每个单独事件之间的时间他们。每个事件都有不同的ID,并且时间段是用来告诉哪里可以找到第一个匹配的。基于此,找到以前的比赛。 – MyStream 2012-04-13 21:28:02

+0

在这种情况下,结果集的数量级为10-100,但要搜索的数据是10M的数量级,所以我不想在最坏的情况下打100次(或10次)问题),但IN语法在这种情况下是完全可行的。 – MyStream 2012-04-13 21:30:09

+0

这应该适用于你,但你应该能够在一个查询中得到整个结果。也许你应该把你现有的查询添加到你的问题中。从你所说的我假设你会运行一个查询,然后将ID传递给这个查询。如果是这种情况,它当然可以组合成一个查询。 – nnichols 2012-04-13 21:35:27