MySQL优化sql连接查询
在一次采访中,我被要求在白板上做这件事,而我的解决方案对于白板回答来说似乎太复杂了 我有两个表,一个表的id和名称为TablePerson,另一个表的id、Person\u id和friend\u id为table friend。朋友桌上的一排表示两个人之间的友谊。我想在不知道吉娜身份的情况下找到她所有的友谊 我想到了:MySQL优化sql连接查询,mysql,sql,query-performance,Mysql,Sql,Query Performance,在一次采访中,我被要求在白板上做这件事,而我的解决方案对于白板回答来说似乎太复杂了 我有两个表,一个表的id和名称为TablePerson,另一个表的id、Person\u id和friend\u id为table friend。朋友桌上的一排表示两个人之间的友谊。我想在不知道吉娜身份的情况下找到她所有的友谊 我想到了: SELECT DISTINCT name FROM (SELECT name1 AS name FROM (SELECT p1.name AS name1, p2.na
SELECT DISTINCT name FROM
(SELECT name1 AS name FROM
(SELECT p1.name AS name1, p2.name AS name2 FROM friend f INNER JOIN person p1 ON f.person_id = p1.id INNER JOIN person p2 ON f.friend_id = p2.id WHERE p2.name LIKE 'Gina' OR p1.name LIKE 'Gina') AS group1
UNION ALL
SELECT name2 AS name FROM
(SELECT p1.name AS name1, p2.name AS name2 FROM friend f INNER JOIN person p1 ON f.person_id = p1.id INNER JOIN person p2 ON f.friend_id = p2.id WHERE p2.name LIKE 'Gina' OR p1.name LIKE 'Gina') AS group2)
AS combo WHERE name <> 'Gina';
我在白板上的想法不好,这不可能是最好的解决方案。谁能优化这个
做了一把小提琴给几个朋友玩
如果你想要的是把吉娜列为朋友的人的名字,这就行了
SELECT person.name
FROM person
JOIN friend on friend.person_id = person.id
WHERE friend.friend_id = (SELECT id FROM person WHERE name = 'Gina')
;
虽然,只有三个人,你不能真正测试相反。更好的测试是添加第四个不应该出现在结果集中的人
更新
根据您更新的模式,这将同时获得Gina的朋友和将Gina作为朋友的人。比你的好。根据我的经验,十有八九的情况下,尽可能简单地陈述查询并让数据库计算出来是最好的方法
SELECT person.name
FROM friend
JOIN person ON person.id = friend.person_id
WHERE friend.friend_id = (SELECT id FROM person WHERE name = 'Gina')
UNION
SELECT person.name
FROM friend
JOIN person ON person.id = friend.friend_id
WHERE friend.person_id = (SELECT id FROM person WHERE name = 'Gina')
;
这是可行的,但我不确定哪一个更快。。。你必须基准测试
SET @gina_id=(SELECT id FROM person WHERE name = 'Gina');
SELECT DISTINCT person.name
FROM person
JOIN friend on (friend.person_id = person.id or friend.friend_id=person.id)
WHERE (friend.friend_id = @gina_id
OR friend.person_id = @gina_id)
AND person.id != @gina_id
问题是:他们让你做一个简单的JOIN语句。不管问什么,有没有办法优化我的答案asking@hermanthriller你在这里找到答案了吗?还有什么我可以帮忙的吗?我加了第四个名字和关系,你的名字和关系更简单。我感觉这可能很快,嗯,它实际上起作用了,当friend.person_id是Gina的id时,这是怎么起作用的?这是因为Fred有两行,但如果您删除friend表中的第一行,这将不再有效。因此,我认为这一行实际上有点错误。它只会在gina出现在friend_id列时找到她的朋友,而不会在person_id列中找到她。试试这把小提琴@hermanthriller是的,这个问题从来没有解释在这个模式中交互是如何工作的,所以它有点开放