2012-04-13 68 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