2013-04-19 57 views
0

我希望這是尋求幫助的合適論壇。我有一個SQL查詢(MySQL)沒有返回日期範圍內(兩個日期之間)的正確記錄。我很樂意回答與查詢有關的問題,但是如果任何人都可以提出建議或糾正SQL Query,那將是一個很好的學習練習。謝謝。幫助複雜的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 
    ); 

正如我所提到的,查詢的工作原理 - 但它不會在兩個日期之間正確地返回記錄。

但是,如果我對數據庫運行這個簡單的查詢:

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' 

我得到正確的日期範圍返回。幫幫我?預計感謝您。 愛德華。

+1

這是正確的論壇,但問題缺乏一個小細節。你說php查詢不會返回預期的結果。這種情況讓我們猜測你的預期與實際得到的結果之間的區別。 –

+0

請將您的問題刪除到a)刪除非SQL信息,因爲您的問題具體是關於SQL,以及b)刪除'tab'字符並替換爲空格(從代碼塊格式的4個空格縮進開始) - 你不應該在代碼塊中有製表符,因爲它會干擾正確的格式。您提出問題的可讀性越高,您獲得答案的機會就越快。謝謝。 :-) –

回答

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年4月16日' 和'2013-04-18'格式示例?

但更重要的是,您的第一個查詢使用相同的日期範圍(如果正確),但也只能獲得特定組織名稱AND(已關閉或已完成)記錄的查詢。那麼,如果第二個查詢返回100條記錄,但主查詢只有70條,那麼除了關閉/完成或另一個組織以外,其他30個狀態是否還有其他30個狀態?另外,如果連接表沒有匹配的ID將阻止返回具有無效ID的ID。確認這一點的唯一方法是在這些表上更改爲LEFT-JOIN語法並查看結果。

+0

謝謝@DRapp。是的,%s變量以YYYY-MM-DD的形式傳入100%,接下來我將變爲LEFT JOIN。你建議將查詢拆分爲2以查看第1部分是否返回X記錄,以及第2部分返回多少部分以查看是否刪除某些記錄(如果有意義的話)。你的建議和解釋最有幫助。謝謝。 – JComBuilder