将一个 table 与另一个 table 中的元数据合并
Combine one table with meta data in another table
我正在尝试合并两个 table 的所有结果。目前,我正在发出两个请求以获得 table,但我相信有很多好的方法可以组合结果。我已经尝试将 join
与此查询一起使用
USE test;
SELECT * FROM main INNER JOIN main_meta ON main.id = main_meta.ref WHERE main.id = 1;
但最终得到了这样的重复数据:
id
body
title
time
id
ref
data
1
happy birthday to you !
Birthday Celebration
2021-10-14 06:34:36
1
1
first_name: ABC
1
happy birthday to you !
Birthday Celebration
2021-10-14 06:34:36
2
1
last_name: DEF
1
happy birthday to you !
Birthday Celebration
2021-10-14 06:34:36
3
1
email: abc@xyz.co
有一个主条目将包含任意数量的元数据,因此主 post 现在重复了多次。我想获得一次主要数据和结果中的多个元数据。
我要找的结果是这样的:
id
body
title
time
id
ref
data
1
happy birthday to you !
Birthday Celebration
2021-10-14 06:34:36
1
1
first_name: ABC
2
1
last_name: DEF
3
1
email: abc@xyz.co
如果您不介意 data
列包含组合值,那么您可能需要考虑使用 GROUP_CONCAT()
。所以像这样的查询:
SELECT main.id, main.body, main.title, main.time,
GROUP_CONCAT(main_meta.data)
FROM main
INNER JOIN main_meta
ON main.id = main_meta.ref
WHERE main.id = 1
GROUP BY id, body, title, time;
.. 会 return 你的结果是这样的:
id
body
title
time
GROUP_CONCAT(main_meta.data)
1
happy birthday to you !
Birthday Celebration
2021-10-14 06:34:36
first_name: ABC,last_name: DEF,email: abc@xyz.co
如果您希望分隔 data
列值(就像在您的问题编辑中一样),那么这个建议(适用于 MySQL v8+ 或 MariaDB v10.2+ 及更高版本):
SELECT CASE WHEN rn=1 THEN id ELSE '' END id,
CASE WHEN rn=1 THEN body ELSE '' END body,
CASE WHEN rn=1 THEN title ELSE '' END title,
CASE WHEN rn=1 THEN time ELSE '' END time,
data
FROM
(SELECT main.id, main.body, main.title, main.time, main_meta.data,
ROW_NUMBER() OVER (PARTITION BY main.id ORDER BY main_meta.id) rn
FROM main
INNER JOIN main_meta
ON main.id = main_meta.ref
WHERE main.id = 1) v;
虽然有可能,但我不确定是否有任何理由这样做,除非它只是为了观看目的。如果最终结果要显示在网页上(例如,用于 Web 报告视图),那么最好在应用程序代码中执行第二个选项,而不是从 MySQL 查询中执行。
无论如何,这里有一个demo fiddle for reference
我正在尝试合并两个 table 的所有结果。目前,我正在发出两个请求以获得 table,但我相信有很多好的方法可以组合结果。我已经尝试将 join
与此查询一起使用
USE test;
SELECT * FROM main INNER JOIN main_meta ON main.id = main_meta.ref WHERE main.id = 1;
但最终得到了这样的重复数据:
id | body | title | time | id | ref | data |
---|---|---|---|---|---|---|
1 | happy birthday to you ! | Birthday Celebration | 2021-10-14 06:34:36 | 1 | 1 | first_name: ABC |
1 | happy birthday to you ! | Birthday Celebration | 2021-10-14 06:34:36 | 2 | 1 | last_name: DEF |
1 | happy birthday to you ! | Birthday Celebration | 2021-10-14 06:34:36 | 3 | 1 | email: abc@xyz.co |
有一个主条目将包含任意数量的元数据,因此主 post 现在重复了多次。我想获得一次主要数据和结果中的多个元数据。
我要找的结果是这样的:
id | body | title | time | id | ref | data |
---|---|---|---|---|---|---|
1 | happy birthday to you ! | Birthday Celebration | 2021-10-14 06:34:36 | 1 | 1 | first_name: ABC |
2 | 1 | last_name: DEF | ||||
3 | 1 | email: abc@xyz.co |
如果您不介意 data
列包含组合值,那么您可能需要考虑使用 GROUP_CONCAT()
。所以像这样的查询:
SELECT main.id, main.body, main.title, main.time,
GROUP_CONCAT(main_meta.data)
FROM main
INNER JOIN main_meta
ON main.id = main_meta.ref
WHERE main.id = 1
GROUP BY id, body, title, time;
.. 会 return 你的结果是这样的:
id | body | title | time | GROUP_CONCAT(main_meta.data) |
---|---|---|---|---|
1 | happy birthday to you ! | Birthday Celebration | 2021-10-14 06:34:36 | first_name: ABC,last_name: DEF,email: abc@xyz.co |
如果您希望分隔 data
列值(就像在您的问题编辑中一样),那么这个建议(适用于 MySQL v8+ 或 MariaDB v10.2+ 及更高版本):
SELECT CASE WHEN rn=1 THEN id ELSE '' END id,
CASE WHEN rn=1 THEN body ELSE '' END body,
CASE WHEN rn=1 THEN title ELSE '' END title,
CASE WHEN rn=1 THEN time ELSE '' END time,
data
FROM
(SELECT main.id, main.body, main.title, main.time, main_meta.data,
ROW_NUMBER() OVER (PARTITION BY main.id ORDER BY main_meta.id) rn
FROM main
INNER JOIN main_meta
ON main.id = main_meta.ref
WHERE main.id = 1) v;
虽然有可能,但我不确定是否有任何理由这样做,除非它只是为了观看目的。如果最终结果要显示在网页上(例如,用于 Web 报告视图),那么最好在应用程序代码中执行第二个选项,而不是从 MySQL 查询中执行。
无论如何,这里有一个demo fiddle for reference