MySQL 查询 - 加入子查询
MySQL Query - Join Subquery
我有什么
我有多个这样的表:
- 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)
我需要什么
我想输出一个 table 包含以下信息:
hw_id | Hostname | created | last edited
12315 | client-01 | 2015-05-06 15:31:06 (username) | 2015-07-02 09:46:17 (username) |
问题
如您所见,我可以通过 外键 和 内连接 获得类似 hw_typ 的信息“tbl_hw_typ
”。对于带有“hw_created_user_idfs
”的信息和获取 username 的 username 与 userid.
的信息相同
但是我怎样才能得到上次编辑、日期时间和用户名?
在我的 table“tbl_hw_edited
”中,我有这样的条目:
row id | hw_id | datetime | user_id
代码
到目前为止,我的 SQL 查询如下所示:
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
那么如何导出信息呢?看起来我必须在查询中进行子查询。但是我每次尝试都失败了。
谢谢你的帮助
编辑
按照建议,我将为每个 table:
提供更多信息(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 |
因此,作为最终结果,我需要这样的输出:
| hw_id | hostname | created | edited |
| 1 | client-01 | 2015-03-06 11:57:42 (ismaelw) | 2015-09-24 23:30:22 (skalb) |
如果我正确解释了你的 table,你需要找到每个 hw_edited_client_idfs(连接到 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
根据该结果,您可以将其返回到源 table,以发现哪个用户与最大(编辑日期)相关联
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
然后这个结果像这样使用:
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
产生这个结果:
| 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 |
我有什么
我有多个这样的表:
- 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)
我需要什么
我想输出一个 table 包含以下信息:
hw_id | Hostname | created | last edited
12315 | client-01 | 2015-05-06 15:31:06 (username) | 2015-07-02 09:46:17 (username) |
问题
如您所见,我可以通过 外键 和 内连接 获得类似 hw_typ 的信息“tbl_hw_typ
”。对于带有“hw_created_user_idfs
”的信息和获取 username 的 username 与 userid.
但是我怎样才能得到上次编辑、日期时间和用户名?
在我的 table“tbl_hw_edited
”中,我有这样的条目:
row id | hw_id | datetime | user_id
代码
到目前为止,我的 SQL 查询如下所示:
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
那么如何导出信息呢?看起来我必须在查询中进行子查询。但是我每次尝试都失败了。
谢谢你的帮助
编辑
按照建议,我将为每个 table:
提供更多信息(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 |
因此,作为最终结果,我需要这样的输出:
| hw_id | hostname | created | edited |
| 1 | client-01 | 2015-03-06 11:57:42 (ismaelw) | 2015-09-24 23:30:22 (skalb) |
如果我正确解释了你的 table,你需要找到每个 hw_edited_client_idfs(连接到 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
根据该结果,您可以将其返回到源 table,以发现哪个用户与最大(编辑日期)相关联
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
然后这个结果像这样使用:
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
产生这个结果:
| 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 |