2010-08-23 73 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