I want to get the last change for all issues issue, that was made before a specified end time. I have 3 tables.
projects
+---+------------+
|ID |project_key |
+---+------------+
|1 |bug_tracker |
+---+------------+
issues
+---+------------+-------------+
|ID |project_key |issue_key |
+---+------------+-------------+
|1 |bug_tracker |bug_tracker-1|
+---+------------+-------------+
|2 |bug_tracker |bug_tracker-2|
+---+------------+-------------+
|3 |bug_tracker |bug_tracker-3|
+---+------------+-------------+
issue_changes
+---+--------------------+------------+----------+-------------+----------------+
|ID |change_by |change_time |issue_key |change_field |change_value |
+---+--------------------+------------+----------+-------------+----------------+
|1 |johny_vegas |1346422320 |1 |Status |Created |
|2 |edward_scissorhands |1346497920 |1 |Status |Open |
|3 |harry_potter |1346546460 |1 |Status |Resolved |
|4 |harry_potter |1346682780 |1 |Status |Closed |
|5 |harry_potter |1346252021 |2 |Status |Created |
|6 |harry_potter |1346252023 |2 |Status |Open |
|7 |cmdr_data |1346338440 |2 |Status |Owned |
|8 |luke_skywalker |1346404980 |2 |Status |Resolved |
|9 |johny_rico |1346419560 |2 |Status |Open |
|10 |johny_rico |1346419560 |2 |Status |Waive Requested |
|11 |edward_scissorhands |1346433300 |2 |Status |Open |
|12 |edward_scissorhands |1346433300 |2 |Status |Waive Requested |
|13 |edward_scissorhands |1346433300 |2 |Status |Waived |
|14 |roger_rabit |1346252052 |3 |Status |Created |
|15 |roger_rabit |1346252054 |3 |Status |Open |
|16 |roger_rabit |1346255700 |3 |Status |Owned |
|17 |cmdr_data |1346261220 |3 |Status |Resolved |
|18 |luke_skywalker |1346405040 |3 |Status |Open |
|19 |johny_vegas |1346423460 |3 |Status |Owned |
+---+--------------------+------------+----------+-------------+----------------+
Now what I expect to get as the result of a query is:
+---+--------------------+------------+----------+-------------+----------------+
|ID |change_by |change_time |issue_key |change_field |change_value |
+---+--------------------+------------+----------+-------------+----------------+
|4 |harry_potter |1346682780 |1 |Status |Closed |
|13 |edward_scissorhands |1346433300 |2 |Status |Waived |
|19 |johny_vegas |1346423460 |3 |Status |Owned |
+---+--------------------+------------+----------+-------------+----------------+
What I am able to get back is:
+---+--------------------+------------+----------+-------------+----------------+
|ID |change_by |change_time |issue_key |change_field |change_value |
+---+--------------------+------------+----------+-------------+----------------+
|1 |johny_vegas |1346422320 |1 |Status |Created |
|5 |harry_potter |1346252021 |2 |Status |Created |
|14 |roger_rabit |1346252052 |3 |Status |Created |
+---+--------------------+------------+----------+-------------+----------------+
The query that I am using is:
SELECT issue1.`issue_key` , changes1.`change_time` , changes1.`change_value` , changes1.`change_field`
FROM `issue_changes` AS changes1
INNER JOIN `issues` AS issue1 ON issue1.`ID` = changes1.`issue_key`
WHERE issue1.`project_key` = "bug_tracker"
AND changes1.`change_field` = "Status"
AND changes1.`change_time` < "1400110321"
GROUP BY issue1.`issue_key`
ORDER BY changes1.`issue_key` , changes1.`change_time` DESC
What am I missing? 🙂
Best Answer
PROPOSED QUERY
SAMPLE DATA
projects
issues
issue_changes
PROPOSED QUERY EXECUTED
EPILOGUE
The main part of the query is the subquery because it retrieves the maximum ID for each issue_key
Then, I take the result of the subquery and
LEFT JOIN
theID
toissue_changes
GIVE IT A TRY !!!