2010-08-23 124 views
0

我正在創建這個應用程序,在當前日期活動或不活動的人員註冊時很重要。我的表格結構如下所示:MySQL問題!只需要從一行中選擇唯一的值

| Field  | Type  | Null | Key | Default   | Extra   | 
+-----------+-------------+------+-----+-------------------+----------------+ 
| id  | int(11)  | NO | PRI | NULL    | auto_increment | 
| kid_id | int(11)  | NO |  | NULL    |    | 
| status | varchar(50) | NO |  | NULL    |    | 
| timestamp | timestamp | NO |  | CURRENT_TIMESTAMP |    | 

對我而言重要的是什麼;僅選擇時間戳等於當前日期的值。接下來,我需要根據kid_id檢查最新狀態是否爲「活動」或「非活動」。我到目前爲止已經弄清楚了這一點。

SELECT kid_id , status , timestamp FROM actions WHERE date(timestamp) = CURDATE() ORDER BY timestamp DESC; 

它返回這些值:

+--------+----------+---------------------+ 
| kid_id | status | timestamp   | 
+--------+----------+---------------------+ 
|  4 | active | 2010-08-23 12:10:03 | 
|  3 | inactive | 2010-08-23 10:53:18 | 
|  3 | active | 2010-08-23 10:53:10 | 
+--------+----------+---------------------+ 

現在唯一的問題是,我收到都與 「kid_id」= 「3」 活動和非活動狀態。 所以我的問題是我如何只選擇每個kid_id的最新狀態。

提前非常感謝您的幫助。非常感謝。

----------編輯

我會盡量讓我的觀點更加清楚一點。

這是我的表,因爲它看起來現在...

+--------+----------+---------------------+ 
| kid_id | status | timestamp   | 
+--------+----------+---------------------+ 
|  3 | inactive | 2010-08-23 18:32:19 | 
|  4 | active | 2010-08-23 12:10:03 | 
|  3 | active | 2010-08-23 10:53:10 | 
+--------+----------+---------------------+ 
3 rows in set (0.00 sec) 

我想檢索這些值只有這些

|  3 | inactive | 2010-08-23 18:32:19 | 
|  4 | active | 2010-08-23 12:10:03 | 

以下所有建議的解決方案返回這些值:

|  4 | active | 2010-08-23 12:10:03 | 
|  3 | active | 2010-08-23 10:53:10 | 

順便說一下......非常感謝所有的答覆,我很感激所有的hel頁。

回答

-1

我今天離開了辦公室。同時我想出瞭解決問題的方法。我使用了一個工作的子查詢。

在結束我的代碼看起來有點像ovais.tariq

這裏是我的解決方案:

SELECT * 
      FROM (
       SELECT * FROM actions 
       AS a 
       WHERE date(timestamp) = curdate() 
       AND timestamp = (
        SELECT max(timestamp) 
        FROM actions 
        AS b 
        WHERE a.kid_id = b.kid_id 
        ) 
       ) 
      AS c 

謝謝大家對你的幫助:)

1

第一,你的WHERE子句應閱讀

WHERE ... AND status = 'active' 

如果你可以有不同的行上被設置爲活躍某一天一個用戶,你可以說

SELECT DISTINCT kid, status ... 

注它會爲您選擇的所有內容返回唯一值,因此您不應選擇時間戳,因爲同一天的同一用戶的不同時間戳會再次顯示爲多行(因爲它們不是不同的)

+0

如果我理解你的代碼正確,這隻返回活躍的孩子,而不是不活躍的孩子。如果我按時間戳排序,我可以得到所有值,但是我仍然無法消除kid_id 3的最後一個活動狀態...如果有任何錯誤,請糾正我。 – nickifrandsen 2010-08-23 11:35:09

+0

啊好吧我錯了,對不起。那麼shamittomar的代碼應該做你想做的事 – Nicolas78 2010-08-23 11:46:24

0

使用group by kid_id只因爲你已經通過時間戳

SELECT kid_id , status , timestamp FROM actions WHERE date(timestamp) = CURDATE() GROUP BY kid_id ORDER BY timestamp DESC 
+0

它按kid_id進行分組,然後按時間戳排序。如果我在排序後嘗試分組,則返回錯誤。 ??? – nickifrandsen 2010-08-23 11:38:08

+0

我的解決方案已解決您的問題? – 2010-08-23 11:58:13

+0

我很抱歉,但沒有解決我的問題。 – nickifrandsen 2010-08-23 16:40:02

0

使用group by訂購這樣的選擇最新行:

SELECT kid_id , status , timestamp, count(*) as TotalMatches FROM actions WHERE date(timestamp) = CURDATE() GROUP BY kid_id ORDER BY timestamp DESC 

[編輯]:僅選擇的工作狀態:

SELECT kid_id , status , timestamp, count(*) as TotalMatches FROM actions WHERE date(timestamp) = CURDATE() AND status = 'active' GROUP BY kid_id ORDER BY timestamp DESC 
+0

這隻會選擇活動狀態? – nickifrandsen 2010-08-23 11:36:11

+0

@nickifrandsen,更新了僅用於選擇活動狀態的代碼。 – shamittomar 2010-08-23 12:51:25

+0

對不起,我認爲我可能有點不清楚。來自kid_id 3的最新狀態等於無效。由於這是一個比活動更新的狀態,我想顯示非活動狀態,而不是... 想象一下,應該檢查孩子是否在家中或者是否已經離開。然後,它需要返回所有仍處於活動狀態的孩子以及所有一直處於活動狀態但已經變更狀態爲非活動狀態的孩子。很像登錄系統。 我希望我已經能夠很好地解釋自己,即使我的英語不是最好的。 – nickifrandsen 2010-08-23 16:30:54

1

這應該做

SELECT a1.* 
FROM actions AS a1 
    INNER JOIN (SELECT kid_id, MAX(`timestamp`) AS `timestamp` 
       FROM actions 
       WHERE date(timestamp) = CURDATE() 
       GROUP BY kid_id) AS a2 
    ON a2.kid_id = a1.kid_id AND a2.timestamp = a1.timestamp 
+0

很抱歉,這是爲了返回兩個活動值而不是非活動值。 – nickifrandsen 2010-08-23 16:52:22

+0

我已編輯查詢,現在可以工作了。 – 2010-08-24 10:36:31