Mysql 无法使用查询从三个表中提取数据

Mysql 无法使用查询从三个表中提取数据,mysql,sql,database,Mysql,Sql,Database,我试图编写MySQL查询,从三个不同的表中检索数据,它们之间没有定义关系 FacebookMusicStars有Facebook上名人的名字 TwitterMusicStars有来自Twitter的名人的名字 YouTubeMusicStars有来自YouTube的名人的名字 问题是我无法在同一个表中按名称匹配它们,因为它们的名称在所有三个表中都有70%不相同。我使用的查询: SELECT f.musicNameFacebook , t.musicNameTwitter ,

我试图编写MySQL查询,从三个不同的表中检索数据,它们之间没有定义关系

FacebookMusicStars
有Facebook上名人的名字

TwitterMusicStars
有来自Twitter的名人的名字

YouTubeMusicStars
有来自YouTube的名人的名字

问题是我无法在同一个表中按名称匹配它们,因为它们的名称在所有三个表中都有70%不相同。我使用的查询:

SELECT f.musicNameFacebook
     , t.musicNameTwitter
     , y.musicNameYoutube
  FROM facebookmusicstars f
  LEFT 
  JOIN twittermusicstars t
    ON f.musicNameFacebook LIKE t.musicNameTwitter
  LEFT 
  JOIN youtubemusicstars y
    ON f.musicNameFacebook LIKE y.musicNameYoutube
LEFT JOIN youtubemusicstars ON facebookmusicstars.musicNameFacebook LIKE youtubemusicstars.musicNameYoutube

我使用windows命令行和MySQL 5.5,在字符集方面,这两种工具似乎不能很好地结合在一起。使用PowerCMD和拉丁文1,我可以得到以下内容,但如果您想考虑其他字符(“@”等),则需要显式地为其编码

SET names latin1;

DROP TABLE IF EXISTS facebookmusicstars;
CREATE TABLE facebookmusicstars 
(musicNameFacebook VARCHAR(30) NOT NULL PRIMARY KEY) DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS twittermusicstars;
CREATE TABLE twittermusicstars 
(musicNameTwitter VARCHAR(30) NOT NULL PRIMARY KEY) DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS youtubemusicstars;
CREATE TABLE youtubemusicstars 
(musicNameYoutube VARCHAR(30) NOT NULL PRIMARY KEY) DEFAULT CHARSET=latin1;


INSERT INTO facebookmusicstars VALUES
('Rihanna'), 
('Eminem'), 
('Shakira'), 
('Pitbull'), 
('Beyoncé'), 
('Wiz Khalifa'), 
('Adele'), 
('Bruno Mars'), 
('Ed Sheeran'), 
('MattyBRaps'), 
('Jason Derulo'), 
('Drake'), 
('MALUMA'), 
('Flo Rida'), 
('Usher'), 
('AKON'), 
('Michel Teló'), 
('Nelly'), 
('INNA'), 
('Farruko'), 
('Ciara'), 
('Trey Songz'), 
('Kesha'), 
('Anitta'), 
('Tyga');

INSERT INTO twittermusicstars VALUES
('Rihanna'), 
('Eminem'), 
('Shakira'), 
('pitbull'), 
('Beyonce'), 
('Adèle'), 
('50 Cent'), 
('Lil Wayne'), 
('Ne-yo'), 
('Drake'), 
('Snoop Dogg'), 
('FettyWap'), 
('Usher'), 
('Akon'), 
('Tyga');

INSERT INTO youtubemusicstars VALUES
('Eminem'), 
('Shakira'), 
('Pitbull'), 
('beyonce'), 
('Wiz Khalifa'), 
('Adele'), 
('Bruno Mars'), 
('Ed Sheeran'), 
('MattyBRaps'), 
('Jason Derulo'), 
('Drake'), 
('Maluma'), 
('Flo Rida'), 
('Usher'), 
('Akon'), 
('Michel Telo'), 
('Nelly'), 
('INNA'), 
('FARRUKO'), 
('Ciara'), 
('Trey Songz'), 
('kesha'), 
('Anitta'), 
('Tyga');
Query OK, 0 rows affected (0.00 sec)

SELECT f.musicNameFacebook
     , t.musicNameTwitter
     , y.musicNameYoutube
  FROM 
     ( SELECT musicNameFacebook musicName
         FROM facebookmusicstars 
        UNION
       SELECT musicNameTwitter
         FROM twittermusicstars 
        UNION
       SELECT musicNameYoutube
         FROM youtubemusicstars 
     ) x 
  LEFT
  JOIN facebookmusicstars f
    ON f.musicNameFacebook = x.musicName
  LEFT 
  JOIN twittermusicstars t
    ON t.musicNameTwitter  = x.musicName
  LEFT 
  JOIN youtubemusicstars y
    ON y.musicNameYoutube  = x.musicName;

+-------------------+------------------+------------------+
| musicNameFacebook | musicNameTwitter | musicNameYoutube |
+-------------------+------------------+------------------+
| Adele             | Adèle            | Adele            |
| AKON              | Akon             | Akon             |
| Anitta            | NULL             | Anitta           |
| Beyoncé           | Beyonce          | beyonce          |
| Bruno Mars        | NULL             | Bruno Mars       |
| Ciara             | NULL             | Ciara            |
| Drake             | Drake            | Drake            |
| Ed Sheeran        | NULL             | Ed Sheeran       |
| Eminem            | Eminem           | Eminem           |
| Farruko           | NULL             | FARRUKO          |
| Flo Rida          | NULL             | Flo Rida         |
| INNA              | NULL             | INNA             |
| Jason Derulo      | NULL             | Jason Derulo     |
| Kesha             | NULL             | kesha            |
| MALUMA            | NULL             | Maluma           |
| MattyBRaps        | NULL             | MattyBRaps       |
| Michel Teló       | NULL             | Michel Telo      |
| Nelly             | NULL             | Nelly            |
| Pitbull           | pitbull          | Pitbull          |
| Rihanna           | Rihanna          | NULL             |
| Shakira           | Shakira          | Shakira          |
| Trey Songz        | NULL             | Trey Songz       |
| Tyga              | Tyga             | Tyga             |
| Usher             | Usher            | Usher            |
| Wiz Khalifa       | NULL             | Wiz Khalifa      |
| NULL              | 50 Cent          | NULL             |
| NULL              | FettyWap         | NULL             |
| NULL              | Lil Wayne        | NULL             |
| NULL              | Ne-yo            | NULL             |
| NULL              | Snoop Dogg       | NULL             |
+-------------------+------------------+------------------+

我看这里没问题。或者你是在“完全连接”(或者MySQL的模拟)之后,你可以使用,但是没有一种简单的方法可以找到部分/相似的匹配,通常需要人工干预来确定匹配是否正确我不认为它像你认为的那样<代码>'a'类似于'aa'为假,但
'abc'类似于'%b%'
为真
LIKE
使您能够使用
%
\uUcode>通配符。@MatBailie这当然取决于排序规则?!?!如果我们不知道数据库中有什么(也不知道提取规则),我们就无法真正帮助您提取。OP正在尝试对a.name b.name
使用
,因为每个表中的名称略有不同。(我没有投反对票)这不是OP的意图,他需要找到一种方法来匹配不完全相同的单词。@sagi这只是选择正确的字符集和排序的问题。我不认为这是你想象中的戏剧。我没有想象任何戏剧,只是提到你的回答无助于OP实现他的目标,我将取消否决票,因为你添加了评论,但我仍然认为你应该添加更多信息来帮助他。@sagi是的,我需要以某种方式命名,但它们在所有领域都不相同。有些名字有“@”,有些名字之间有“空格”,等等。我发布的图片完美地显示了where为null,该名称与tabel的其他列不同。