将一个 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