簡體   English   中英

MySQL優化SQL聯接查詢

[英]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:

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

如果您想要的是將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

這是小提琴: http ://sqlfiddle.com/#!2/ 962db/3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM