2017-02-20 2 views
1

Ich versuche, die Summe Zeit für jeden Benutzer in einer bestimmten Gruppe in den nächsten 30 Tagen gezogen zu ziehen. Ich bin bei MySQL nicht großartig, daher kann vieles falsch sein. Dies ist aus einer JIRA-Datenbank.MySQL Query Multiple Joins duplizieren Daten für jede Zeile? JIRA-Datenbank

SELECT DISTINCT cu.display_name AS 'Associate', sum(wl.timeworked/3600) AS '30 Days' 
    FROM worklog AS wl, cwd_user AS cu 
    INNER JOIN cwd_membership AS cm 
     ON cu.directory_id=cm.directory_id 
     AND cu.lower_user_name=cm.lower_child_name 
     AND cm.membership_type='GROUP_USER' 
    INNER JOIN worklog 
     ON worklog.AUTHOR = cu.user_name 
    WHERE cm.lower_parent_name='atl_servicedesk_it_agents' AND wl.STARTDATE BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 30 DAY) 
ORDER BY cu.last_name; 

Gerade jetzt zeigt es nur die ersten Nutzer mit einer Summe von allem Namen in der Zeit für alle gearbeitet. Das ist natürlich nicht das, was ich will ... Wenn ich die Summe aus der Zeitarbeit entferne, zeigt sie ungefähr die Hälfte der Benutzer aus dieser Gruppe, aber jeder Benutzer hat einen Wert von 16 Stunden für die Zeitarbeit, was falsch ist. Nur ein Benutzer hat einen Wert für die nächsten 30 Tage und es ist für 16 Stunden, aus irgendeinem Grund verdoppelt es diese Information. Irgendwelche Ideen?

+0

Ich versuche es 'GROUP BY cu. display_name' (oder besser irgendein Primärschlüssel für den Benutzer) und nach der WHERE-Klausel platzieren und 'DISTINCT' entfernen, führt das zu anderen Ergebnissen? –

+0

Doing das zeigt jetzt alle Namen, nun 136 der 367. Allerdings haben diese immer noch zufällige Zeiten von ihren Namen, wenn es eigentlich nur eine Zeile geben sollte, weil nur ein Benutzer Zeit für die nächsten 30 Tage geloggt hat. Ich bin nicht sicher, ob ich den Berechnungsteil falsch gemacht habe mit der Berechnung der Summe basierend auf den Zahlen von irgendjemand und nicht nur, wo die Namen gleich sind. – Cole

Antwort

0

Haben es funktioniert, indem Sie die INNER JOINs herausnehmen.

SELECT cwd_user.display_name AS 'Associate', sum(worklog.timeworked/3600) AS '30 Days' 
FROM worklog, cwd_user,cwd_membership 
WHERE worklog.AUTHOR = cwd_user.user_name 
and cwd_user.directory_id = cwd_membership.directory_id 
and cwd_user.lower_user_name = cwd_membership.lower_child_name 
and cwd_membership.membership_type = 'GROUP_USER' 
and cwd_membership.lower_parent_name = 'atl_servicedesk_it_agents' 
and worklog.STARTDATE BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 60 DAY) 
GROUP BY cwd_user. display_name 
ORDER BY cwd_user.last_name;