0

我有以下东西,就像一个魅力。

SELECT d.decisionName, c.firstname, c.lastname, o.name AS organization_name, s.parent_session_id
    FROM tblDecisions d
        INNER JOIN tblSessions s ON s.decision_id = d.decisionid
        INNER JOIN tblCounselors c ON s.counselor_ck = c.campusid
        INNER JOIN tblCounselor_to_organization co ON co.counselor_id = c.counselorid
        INNER JOIN tblOrganizations o ON o.organizationid = co.organization_id
    AND s.start_time >= '2011-01-01 00:00:00'
    AND s.is_complete = TRUE
    ORDER BY s.start_time, s.last_name, s.first_name

该字段parent_session_id(整数)可以存储先前记录的主ID,否则默认为0。如果可能的话,我想做的是使用嵌套或子查询进行以下操作:

  1. 检索上述所有内容,但如果它的主 ID 正在被 parent_session_id 字段中的另一个人使用,则删除任何记录。

  2. 如果多条记录在 parent_session_id 字段中引用同一条记录(> 0),则仅通过时间戳(s.start_time DESC LIMIT 1)获取最新的一条

我有一种感觉,如果不使查询变得异常复杂,这是不可能的,但是我的查询技能并没有比我上面所掌握的更深入。

4

2 回答 2

2

1.) 检索上述所有内容,但如果它的主 ID 正在被 parent_session_id 字段中的另一个人使用,则删除任何记录。

假设您的主 ID 是tblSessions.session_id

SELECT d.decisionName, c.firstname, c.lastname, o.name AS organization_name
                                              , s.parent_session_id
FROM   tblDecisions                 d
JOIN   tblSessions                  s ON s.decision_id = d.decisionid
JOIN   tblCounselors                c ON c.campusid = s.counselor_ck
JOIN   tblCounselor_to_organization co ON co.counselor_id = c.counselorid
JOIN   tblOrganizations             o ON o.organizationid = co.organization_id
AND    s.start_time >= '2011-01-01 00:00:00'
AND    s.is_complete
AND    NOT EXISTS (
    SELECT 1
    FROM   tblSessions s1
    WHERE  s1.parent_session_id = s.session_id
    )
ORDER  BY s.start_time, s.last_name, s.first_name;

您的第二个问题与第一个问题相矛盾。所以,我将把它留在那里:

2.) 如果多条记录在 parent_session_id 字段中引用同一条记录 (> 0),则只获取最新的一条时间戳 ( s.start_time DESC > LIMIT 1)

于 2012-09-07T20:28:59.240 回答
1

我认为第二个问题与第一个问题并不矛盾。首先是说,本质上,如果此会话是任何其他会话的父级,则不要将其包含在结果中。第二个问题是说,如果多个会话具有相同的父级,则仅包括最新的子级。

这是我包含两个子问题的解决方案:

SELECT d.decisionName, c.firstname, c.lastname, o.name AS organization_name,  s.parent_session_id
, s.start_time, (SELECT max(start_time)
                      FROM tblSessions s2
                      WHERE s2.parent_session_id = s.parent_session_id)
FROM tblDecisions d
    INNER JOIN tblSessions s ON s.decision_id = d.decisionid
    INNER JOIN tblCounselors c ON s.counselor_ck = c.campusid
    INNER JOIN tblCounselor_to_organization co ON co.counselor_id = c.counselorid
    INNER JOIN tblOrganizations o ON o.organizationid = co.organization_id
AND s.start_time >= '2011-01-01 00:00:00'
AND s.is_complete = 1
AND NOT EXISTS (
  SELECT 1
  FROM   tblSessions s1
  WHERE  s1.parent_session_id = s.sessionid
  )
AND (
     (s.parent_session_id IS NULL)
  OR (s.start_time = (SELECT max(start_time)
                      FROM tblSessions s2
                      WHERE s2.parent_session_id = s.parent_session_id))) 

ORDER BY s.start_time, s.last_name, s.first_name

这是一个演示它的 SQLFiddle。

请注意,我使用的是 SQL Server,而不是 MySQL。但我相信解决方案很容易转换;我认为只有is_complete = 1需要更改为is_complete = true

于 2012-09-08T06:22:24.633 回答