[英]MySQL optimizing sql join query
面試中有人問我要在白板上這樣做,而我的解決方案似乎太復雜了,無法回答白板。
我有兩個表,一個表的ID和名稱為Person表,另一個表的ID,person_id和friend_id表為Friend。 朋友表中的一行表示兩個人之間的友誼。 我想找到所有與“ Gina”建立友誼的實例,而無需知道她的身份證。
我想出了:
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';
我在白板上的效果不佳,這不是解決此問題的最佳方法。 誰能優化這個?
之后為幾個朋友制作了一個sqlfiddle:
如果您想要的是將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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.