簡體   English   中英

協助進行復雜的MySQL SQL查詢

[英]Assistance with a complex MySQL SQL Query

我希望這是尋求幫助的合適論壇。 我有一個SQL查詢(MySQL),它沒有在日期范圍(兩個日期之間)中返回正確的記錄。 我很高興回答與查詢有關的問題,但是,如果有人可以提出建議或更正SQL Query,那將是一個很好的學習方法。 謝謝。

$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
    );

正如我提到的,查詢有效-但是它不能在兩個日期之間正確返回記錄。

但是,如果我對數據庫運行以下簡單查詢:

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'

我得到正確的日期范圍返回。 救命? 謝謝您的期待。 愛德華

除非您考慮過度,否則所有操作都在您不同的查詢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(關閉或完成)記錄的日期范圍。 因此,如果第二個查詢返回100條記錄,但主查詢僅返回70條記錄,那么其他30條狀態是否為已關閉/已完成或其他組織? 此外,如果聯接表沒有匹配的ID,則將阻止返回具有無效ID的ID。 確認的唯一方法是更改​​這些表上的LEFT-JOIN語法並查看結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM