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. 上記のすべてを取得しますが、parent_session_id フィールドでプライマリ ID が別の ID によって使用されている場合は、レコードを削除します。

  2. 複数のレコードがparent_session_idフィールドで同じレコードを参照している場合( > 0)、タイムスタンプによって最新のもののみを取得します( s.start_time DESC LIMIT 1)

クエリをとてつもなく複雑にしない限り、これは不可能だと感じていますが、私のクエリスキルは、上記よりもはるかに深くなりません.

4

2 に答える 2

2

1.) Retrieve all the above, but remove any record if it's primary ID is being used by another in the parent_session_id field.

Assuming that your primary ID is 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;

Your second question contradicts the first. So, I'll leave it at that:

2.) If multiple records reference the same record in parent_session_id field (> 0), only get the latest one by time stamp (s.start_time DESC > LIMIT 1)

于 2012-09-07T20:28:59.240 に答える
1

2 番目の質問が最初の質問と矛盾しているとは思いません。1 つ目は、本質的に、このセッションが他のセッションの親である場合、それを結果に含めないということです。2 番目の質問は、複数のセッションが同じ親を持つ場合、最新の子のみを含めるということです。

両方のサブ質問を組み込んだ私のソリューションは次のとおりです。

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 です。

MySQL ではなく、SQL Server を使用したことに注意してください。しかし、このソリューションは簡単に変換できると思います。is_complete = 1だけをis_complete = trueに変更する必要があると思います。

于 2012-09-08T06:22:24.633 に答える