0

これが支援を求める適切なフォーラムであることを願っています。日付範囲 (2 つの日付の間) で正しいレコードを返さない SQL クエリ (MySQL) があります。クエリに関連する質問に喜んでお答えしますが、誰かが提案をしたり、SQL クエリを修正したりすることができれば、それは優れた学習課題となります。ありがとうございました。

$raw_query = sprintf("SELECT
swtickets.ticketid AS `Ticket ID`,
swtickettimetracks.tickettimetrackid AS `Track ID`,
swtickets.ticketmaskid AS `TicketMASK`,
(
    SELECT
        swcustomfieldvalues.fieldvalue
    FROM
        swcustomfieldvalues,
        swcustomfields
    WHERE
        swcustomfieldvalues.customfieldid = swcustomfields.customfieldid
    AND swtickets.ticketid = swcustomfieldvalues.typeid
    AND swcustomfields.title = 'Member Company'
    ORDER BY
        swcustomfieldvalues.customfieldvalueid DESC
    LIMIT 1
) AS MemberCompany,
(
    SELECT
        swcustomfieldvalues.fieldvalue
    FROM
        swcustomfieldvalues,
        swcustomfields
    WHERE
        swcustomfieldvalues.customfieldid = swcustomfields.customfieldid
    AND swtickets.ticketid = swcustomfieldvalues.typeid
    AND swcustomfields.title = 'Member Name'
    ORDER BY
        swcustomfieldvalues.customfieldvalueid DESC
    LIMIT 1
) AS MemberName,
(
    SELECT
        swcustomfieldvalues.fieldvalue
    FROM
        swcustomfieldvalues,
        swcustomfields
    WHERE
        swcustomfieldvalues.customfieldid = swcustomfields.customfieldid
    AND swtickets.ticketid = swcustomfieldvalues.typeid
    AND swcustomfields.title = 'Chargeable'
    AND 
        swcustomfieldvalues.fieldvalue = '40'
    ORDER BY
        swcustomfieldvalues.customfieldvalueid ASC
    LIMIT 1
) AS `Chg`,
swtickets.`subject` AS `Subject`,
swtickets.departmenttitle AS Category,
FROM_UNIXTIME(
    swtickettimetracks.workdateline
) AS `workDateline`,
FROM_UNIXTIME(
    swtickettimetracks.dateline
) AS `dateline`,
swtickettimetracks.timespent AS `Time Spent`,
swtickets.timeworked AS `Time Worked`
    FROM
swtickets
    INNER JOIN swusers ON swtickets.userid = swusers.userid
    INNER JOIN swuserorganizations ON swuserorganizations.userorganizationid = swusers.userorganizationid
    INNER JOIN swtickettimetracks ON swtickettimetracks.ticketid = swtickets.ticketid
    WHERE
    swuserorganizations.organizationname = '%s'
    AND (
    swtickets.ticketstatustitle = 'Closed'
OR swtickets.ticketstatustitle = 'Completed'
    )

    AND FROM_UNIXTIME(`workDateline`) >= '%s' AND FROM_UNIXTIME(`workDateline`) <= '%s'

    ORDER BY `Ticket ID`,`Track ID`",
        $userOrganization,
        $startDate,
        $endDate
    );

前述したように、クエリは機能しますが、2 つの日付の間のレコードが正しく返されません。

ただし、データベースに対してこの単純なクエリを実行した場合:

SELECT swtickettimetracks.tickettimetrackid, 
swtickettimetracks.ticketid, 
swtickettimetracks.dateline, 
swtickettimetracks.timespent, 
swtickettimetracks.timebillable,
    FROM_UNIXTIME(swtickettimetracks.workdateline)

    FROM swtickettimetracks

    WHERE FROM_UNIXTIME(swtickettimetracks.workdateline) >= '2013-04-16' AND FROM_UNIXTIME(swtickettimetracks.workdateline) <= '2013-04-18'

正しい日付範囲が返されます。ヘルプ?期待していただきありがとうございます。エドワード。

4

1 に答える 1

0

考えすぎない限り、すべてが異なるクエリの WHERE 句にあります...

間違った結果を返す複雑なクエリには

  (join conditions between other tables)
  AND swuserorganizations.organizationname = '%s'
  AND ( swtickets.ticketstatustitle = 'Closed'
     OR swtickets.ticketstatustitle = 'Completed' )
  AND FROM_UNIXTIME(`workDateline`) >= '%s' 
  AND FROM_UNIXTIME(`workDateline`) <= '%s'

あなたのその他のクエリは

FROM swtickettimetracks
WHERE FROM_UNIXTIME(swtickettimetracks.workdateline) >= '2013-04-16' 
  AND FROM_UNIXTIME(swtickettimetracks.workdateline) <= '2013-04-18'

そこで、いくつかのことを検討します。最初の場所

FROM_UNIXTIME >= '%s' および FROM_UNIXTIME <= '%s'

'%s' の値は、'2013-04-16' および '2013-04-18' 形式のサンプルと一致するように適切に形式設定されていますか?

しかし、もっと重要なのは、最初のクエリが同じ日付範囲を使用している (正しい場合) だけでなく、特定の組織名 AND (クローズまたは完了) レコードのデータのみを取得していることです。では、2 番目のクエリが 100 件のレコードを返しているのに、メイン クエリが 70 件しか返していない場合、残りの 30 件はクローズ済み/完了以外のステータスですか、それとも別の組織ですか? さらに、結合テーブルに一致する ID がない場合、無効な ID を持つテーブルが返されなくなります。これを確認する唯一の方法は、これらのテーブルで LEFT-JOIN 構文に変更して結果を確認することです。

于 2013-04-19T11:52:51.657 に答える