0

What I have

I have multiple Tables like this:

  • tbl_hw_inventar (hw_id, hostname, hw_typ_idfs, hw_created_user_idfs, etc...)
  • tbl_hw_typ (hw_typ_id, hw_typ_title, etc...)
  • tbl_user (user_id,username, etc...)
  • tbl_hw_edited (hw_edited_id, hw_edited_client_idfs, hw_edited_date, hw_edited_user_idfs)

What I need

I want output a table with the following information:

 hw_id | Hostname | created                         | last edited 

 12315 | client-01 | 2015-05-06 15:31:06 (username) | 2015-07-02 09:46:17 (username) |

The problem

As you can see, I can get information like the hw_typ with a foreign key and a inner join to the "tbl_hw_typ". The same for information with "hw_created_user_idfs" and a inner join to get the username for the userid.

But how can I get the last edited, datetime and the username?

In my table "tbl_hw_edited" i have entries like this:

row id | hw_id | datetime | user_id

The code

My SQL query looks like this so far:

SELECT `tbl_hw_inventar`.*, `tbl_hw_typ`.`hw_typ_title`, `tbl_user`.`username`, `tbl_hw_edited`.`hw_edited_id` 
FROM `tbl_hw_inventar` 
INNER JOIN `tbl_hw_typ` 
ON `tbl_hw_inventar`.`hw_typ_idfs` = `tbl_hw_typ`.`hw_typ_id` 
INNER JOIN `tbl_user` 
on `tbl_hw_inventar`.`hw_create_user_idfs` = `tbl_user`.`id`
JOIN (
    SELECT MAX(`tbl_hw_edited`.`hw_edited_id`), `tbl_hw_edited`.`hw_edited_client_idfs`
    FROM `tbl_hw_edited`
    ) `tbl_hw_edited` ON `tbl_hw_inventar`.`hw_id` = `tbl_hw_edited`.`hw_edited_client_idfs`
ORDER BY `tbl_hw_inventar`.`hw_id` ASC

So how can I export the information? It looks like I have to make a subquery in my query. But I failed with every try.

Thanks for you help

EDIT

As proposed I'm providing more information (table data) for each table:

-tbl_hw_inventar-
| hw_id | hw_hostname | hw_create_date      | hw_create_user_idfs |
| 1     | client-01   | 2015-03-06 11:57:42 | 1                   |
| 2     | client-02   | 2015-09-21 21:17:00 | 3                   |

-tbl_hw_edited-
| hw_edited_id | hw_edited_client_idfs | hw_edited_date      | hw_edited_user_idfs |
| 1            | 1                     | 2015-09-24 17:30:22 | 1                   |
| 2            | 2                     | 2015-09-24 16:33:22 | 2                   |
| 3            | 1                     | 2015-09-24 23:30:22 | 2                   |
| 4            | 2                     | 2015-09-24 20:30:22 | 3                   |

-tbl_user-
| id | username |
| 1  | ismaelw  |
| 2  | skalb    |
| 3  | yrumpel  |

So as a final result I need an output like this:

| hw_id | hostname  | created                       | edited                      |
| 1     | client-01 | 2015-03-06 11:57:42 (ismaelw) | 2015-09-24 23:30:22 (skalb) |
4
  • It would be easier to answer your question if there were a few rows of data for each table. Having sample data removes some guesswork and allows us to test our suggestions. Commented Sep 28, 2015 at 7:25
  • 1
    where do you get the created date from? Commented Sep 28, 2015 at 7:27
  • @Used_By_Already I added a few more details about what I need and some rows of table data. Commented Sep 28, 2015 at 7:49
  • yes, got the data thanks, & I see you have the created date, just add that into the select clause where you need it Commented Sep 28, 2015 at 8:10

1 Answer 1

1

If I have interpreted your tables correctly, you need to find the max(edit date) for each hw_edited_client_idfs (which joins to hw_id)

                            SELECT
                                  hw_edited_client_idfs
                                , MAX(hw_edited_date) AS last_edit_dt
                            FROM tbl_hw_edited
                            GROUP BY hw_edited_client_idfs

With that result you may join it back to the source table, to discover which user is associated to the max(edit date)

                SELECT
                      het.*
                FROM tbl_hw_edited AS het
                      INNER JOIN (
                            SELECT
                                  hw_edited_client_idfs
                                , MAX(hw_edited_date) AS last_edit_dt
                            FROM tbl_hw_edited
                            GROUP BY hw_edited_client_idfs
                      ) AS mx ON het.hw_edited_client_idfs = mx.hw_edited_client_idfs
                                  AND het.hw_edited_date = mx.last_edit_dt

Then this result used like so:

SELECT
      i.hw_id
    , i.hw_hostname
    , uc.username created_by
    , he.hw_edited_date last_edit_date
    , ue.username last_edit_by
FROM tbl_hw_inventar AS i
      INNER JOIN tbl_user AS uc ON i.hw_create_user_idfs = uc.id
      LEFT OUTER JOIN (
                SELECT
                      het.*
                FROM tbl_hw_edited AS het
                      INNER JOIN (
                            SELECT
                                  hw_edited_client_idfs
                                , MAX(hw_edited_date) AS last_edit_dt
                            FROM tbl_hw_edited
                            GROUP BY hw_edited_client_idfs
                      ) AS mx ON het.hw_edited_client_idfs = mx.hw_edited_client_idfs
                                  AND het.hw_edited_date = mx.last_edit_dt
          ) AS he ON i.hw_id = he.hw_edited_client_idfs
      LEFT OUTER JOIN tbl_user AS ue ON he.hw_edited_user_idfs = ue.id

which produces this result:

| hw_id | hw_hostname | username |              hw_edited_date | username |
|-------|-------------|----------|-----------------------------|----------|
|     1 |   client-01 |  ismaelw | September, 24 2015 23:30:22 |    skalb |
|     2 |   client-02 |  yrumpel | September, 24 2015 20:30:22 |  yrumpel |

see this sqlfiddle

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you very much! Works like a charm!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.