一尘不染

如何在2个不同的数据库上保留2个表的联接?

sql

我有第一个数据库 (dbA), 具有这样的表,名为 Username

+------------------+--------------+
| Username         | PhoneNumber  |
+------------------+--------------+
| jamesbond007     | 555-0074     |
| batmanbegins     | 555-0392     |
+------------------+--------------+

然后,在另一侧,我有 一个 带有这样的表的 dbB ,名为 PrivateMessage

+------------------+---------------------------------+
| Username         | Message                         |
+------------------+---------------------------------+
| jamesbond007     | I need new bond-girl            |
| batmanbegins     | thanks for the paycheck, Nolan  |
+------------------+---------------------------------+

现在,如何组合来自2个不同数据库的这两个表,以便输出看起来像这样:

+------------------+--------------+---------------------------------+
| Username         | PhoneNumber  | Message                         |
+------------------+--------------+---------------------------------+
| jamesbond007     | 555-0074     | I need new bond-girl            |
| batmanbegins     | 555-0392     | thanks for the paycheck, Nolan  |
+------------------+--------------+---------------------------------+

阅读 124

收藏
2021-03-10

共1个答案

一尘不染

您可以简单地加入不同数据库的表。您需要在FROM子句中指定数据库名称。要使其更短,请在其ALIAS上添加一个,

SELECT  a.*,          -- this will display all columns of dba.`UserName`
      b.`Message`
FROM  dba.`UserName` a  -- or LEFT JOIN to show all rows whether it exists or not
      INNER JOIN dbB.`PrivateMessage` b    
         ON a.`username` = b.`username`

但是有些方法却有可能-在其中username没有消息。在这种情况下,LEFT JOIN如果您仍要显示的所有记录,请使用dba.Username

从您的评论中读取,这些表具有不同的collation。解决此问题的方法是COLLATE在您的联接语句中指定,

SELECT  a.*,          -- this will display all columns of dba.`UserName`
      b.`Message`
FROM  dba.`UserName` COLLATE latin1_swedish_ci a  
      LEFT JOIN dbB.`PrivateMessage` COLLATE latin1_swedish_ci b    
         ON a.`username` = b.`username`

您可以更改latin1_swedish_ci为任何您想要的。

有关COLLATION的更多信息,请参阅以下完整列表

MySQL中的字符集和排序规则


如果您ALTER对表有足够的特权,只需使用此语法即可手动转换并匹配它们的排序规则,

ALTER TABLE tbl_name CONVERT TO CHARACTER SET latin2 COLLATE 'latin2_general_ci';
2021-03-10