Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL优化sql连接查询_Mysql_Sql_Query Performance - Fatal编程技术网

MySQL优化sql连接查询

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

在一次采访中,我被要求在白板上做这件事,而我的解决方案对于白板回答来说似乎太复杂了

我有两个表,一个表的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.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是的,这个问题从来没有解释在这个模式中交互是如何工作的,所以它有点开放