2013-04-19 3 views
0

Я надеюсь, что это подходящий форум, чтобы обратиться за помощью. У меня есть SQL Query (MySQL), который не возвращает правильные записи в диапазоне дат (между двумя датами). Я рад ответить на вопросы в связи с запросом, однако, если кто-либо может внести предложения или исправить 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 
    ); 

Как я уже говорил, Query работает - однако он не возвращает записи правильно между двумя датами.

Однако, если я запускаю этот простой запрос к базе данных:

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

Пожалуйста, отредактируйте свой вопрос: а) удалите информацию, отличную от SQL, так как ваш вопрос конкретно о SQL, и b) удалите символы 'tab' и замените пробелами (начиная с отступа 4 пробелов для форматирования кода кода) - у вас никогда не должно быть вкладок внутри блоков кода, так как это мешает правильному форматированию. Чем читабельнее вы зададите свой вопрос, тем лучше ваши шансы получить ответ быстро. Благодарю. :-) –

ответ

0

Если вы не overthinking его, все это в вашем другом запросе 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»?

Но, что еще более важно, ваш первый запрос использует тот же диапазон дат (если он правильный), но также получает только те, которые относятся к конкретным названиям организации И (закрыто или завершено). Итак, если во втором запросе возвращается 100 записей, но основной запрос - только 70, то остальные 30 - другой статус, кроме закрытого/завершенного или другой организации? Кроме того, если таблицы объединений не имеют совпадающих идентификаторов, которые предотвратили бы возврат тех, у кого были неверные идентификаторы. Единственный способ подтвердить, что это изменить синтаксис LEFT-JOIN на эти таблицы и увидеть результаты.

+0

Спасибо @DRapp. Да, переменные% s передаются на 100% в виде ГГГГ-ММ-ДД, а затем я буду переключаться на ЛЕВЫЙ СОЕДИНЕНИЕ. И вы советуете разделить запрос на 2, чтобы увидеть, возвращает ли часть 1 записи X, и сколько из них возвращено в части 2, чтобы увидеть, если я удаляю некоторые записи (если это имеет смысл). Вам советы и объяснения были наиболее полезными. Спасибо. – JComBuilder

Смежные вопросы