0

我怎样才能消除人的重复。

SELECT Persons.Id, Activity.Activity, Activity.Description, Activity.StartDate, Activity.EndDate
FROM Activity
INNER JOIN Login_Activity ON Activity.ActivityId = Login_Activity.ActivityId
INNER JOIN Persons ON Login_Activity.LoginId = Persons.LoginId
AND Activity.Description IS NOT NULL ORDER BY Persons.Id DESC


Person 1 - Activity 1
Person 1 - Activity 2
Person 2 - Activity 1
Person 3 - Activity 2
Person 3 - Activity 3

编辑:我想要这个结果。

Person 1 - Activity 1
Person 2 - Activity 1
Person 3 - Activity 3

这是因为活动表还包含一些时间表,我只想要每个活动的最后一个日期时间。对于那个问题,我只使用 ORDER DESC 函数。但我还需要消除重复项。

EDIT2:如果我只使用 SQL 查询对最大值进行排序,然后使用 PHP 数组只显示一次。

mainArray = array(

 'person' => '1', 'Activity' => 'abc', 

'person' => '1', 'Activity' => 'cba',

'person' => '2', 'Activity' => 'abc',

'person' => '2', 'Activity' => 'cba',

'person' => '3', 'Activity' => 'cba'

);
4

2 回答 2

0

您需要一个中间子查询来识别您希望为每个用户提供的最新(或其他)登录活动。假设Login_Activity有一个名为的字段LoginActivityID是一个整数自动增量字段,那么这将起作用:

SELECT
    P.Id, 
    A.Activity, 
    A.Description, 
    A.StartDate, 
    A.EndDate
FROM
    Persons P
            INNER JOIN
    (
        SELECT  LA2.LoginId, MAX(LA2.LoginActivityID) LoginActivityID
        FROM    Login_Activity LA2
                        INNER JOIN
                Activity A2
        WHERE   A2.Description IS NOT NULL
        GROUP BY LA2.LoginId
    ) LAX
            ON
        P.LoginId = LAX.LoginId
            INNER JOIN
    Login_Activity LA
            ON
        LAX.LoginActivityID = LA.LoginActivityID
            INNER JOIN
    Activity A
            ON
        LA.ActivityID = A.ActivityID
于 2013-06-15T17:36:17.757 回答
0

你没有说你正在使用什么 SQL 风格 - 它对什么是可能的有很大的影响。

现在大多数数据库都支持 RANK 功能,这提供了一种非常有效的解决方案。(一个值得注意的例外是 MySql - 它不支持 RANK)

在 CTE 中,RANK() 用于按日期降序排列每个人的所有活动。我假设您想保留最新的完成,并且在出现平局时,最新的开始,如果仍然平局,我使用活动 PK 作为平局断路器来确定查询。

外部查询只是从 CTE 中选择排名为 1 的所有记录。

这能够通过对 Activity 表的单次扫描来提供答案 - 没有讨厌的相关子查询来减慢速度:-)

with rankedActivities as (
 select p.Id,
        a.Activity,
        a.Description,
        a.StartDate,
        a.EndDate
        Rank() over (
          partition by p.Id
          order by a.EndDate desc, a.StartDate desc, a.ActivityId desc
        ) dateRank
   from persons p
   inner join Login_Activity la
      on la.LoginId = p.LoginId
   inner join Activity a
      on a.ActivityId = la.ActivityId
)
select Id,
       Activity,
       Description,
       StartDate,
       EndDate
  from rankedActivies
 where dateRank=1
;
于 2013-06-15T20:10:26.867 回答