我在面试时被要求在白板上做这个,我的解决方案对于白板答案来说似乎太复杂了。
我有两张表,一张有 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 以供之后使用:
最佳答案
这行得通,但我不确定哪个更快...您必须进行基准测试...
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/