MySQL优化sql join查询

标签 mysql sql query-performance

我在面试时被要求在白板上做这个,我的解决方案对于白板答案来说似乎太复杂了。

我有两张表,一张有 ids 和 names 作为表 Person,另一张有 id、person_id 和 friend_id 作为表 Friend。 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';

我在白板上的想法不太好,这不是最好的解决方案。谁能优化这个?

为几个 friend 制作了一个 sqlfiddle 以供之后使用:

http://sqlfiddle.com/#!2/9d10b/16

最佳答案

这行得通,但我不确定哪个更快...您必须进行基准测试...

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

这是 fiddle :http://sqlfiddle.com/#!2/962db/3

关于MySQL优化sql join查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23048852/

相关文章:

mysql - ASP.net 代码返回打开 session 错误

php - 短信到数据库

sql - TSQL 返回存在的内容

sql - Postgres - 获取多个表中所有行的最快方法

SQL 性能,什么在 SELECT 和 WHERE 条件下执行得更快

mysql - 将查询中的 NULL 值替换为另一行的值

php - PDO 错误 : "Invalid parameter number: parameter was not defined"

SQL选择一行的后代

mysql - 什么是 SFW 查询?

postgresql - 减少 postgresql 中的执行时间