我正在使用連接表定義兩個表之間的關系。我想按照許多重疊的東西的順序排列它們。目前,我們正在使用子查詢,有沒有辦法使用 join 獲得相同的結果?
People FoodTable PeopleFood
ID | NAME ID | Food ID | PeopleId | FoodId
1 BOB 1 Hamberger 1 1 1
2 JOHN 2 Pizza 2 1 2
3 KATY 3 Chicken 3 1 3
4 MILLER 4 Salad 4 2 1
5 AMANDA 5 Sushi 5 2 2
6 2 3
7 3 2
8 3 3
9 4 3
10 4 5
11 5 5
表這樣定義的時候,我想把食物的口味排列成和Bob的差不多。我現在就是這樣做的。
SELECT people_id, COUNT(people_id) as count
FROM peopleFood
WHERE food_id IN
(SELECT food_id FROM peopleFood
WHERE people_id = 1)
AND people_id != 1
GROUP BY people_id
ORDER BY count DESC;
-- Result -------------
People_id | count
2 3
3 2
4 1
有沒有更好的方法來改變這種方法或使用連接?謝謝!!!
uj5u.com熱心網友回復:
你在表名和列名的使用上一直不一致——
表格 -PeopleFood在您的示例資料中,但您peopleFood在查詢中參考。
列-PeopleId和FoodId你的樣本資料,但參考people_id,并food_id在您的查詢。
選擇一個命名約定并堅持下去。每個人都有自己的喜好,但重要的是要保持一致。
使用 INNER JOIN 而不是您的子查詢的等效查詢是 -
SELECT
`pf2`.`people_id`,
COUNT(`pf2`.`food_id`) as `count`
FROM `PeopleFood` `pf1`
INNER JOIN `PeopleFood` `pf2`
ON `pf2`.`people_id` <> `pf1`.`people_id`
AND `pf2`.`food_id` = `pf1`.`food_id`
WHERE `pf1`.`people_id` = 1
GROUP BY `pf2`.`people_id`
ORDER BY `count` DESC;
兩個查詢之間的性能差異不太可能很明顯,并且可能會爭論說,在您的帶有子查詢的版本中意圖更清晰。
代理鍵ID在你的PeopleFood表應該有利于化合物“自然”上的主鍵的被丟棄people_id和food_id。
關系表中無用代理鍵的成本
uj5u.com熱心網友回復:
內部聯接:
SELECT p.People_id, COUNT(p.People_id) as count FROM PeopleTable p
INNER JOIN FoodTable f
ON(p.People_id = f.FoodId)
WHERE people = 1
GROUP BY p.people_id
ORDER BY count DESC;
如果有幫助,請將其標記為已接受的答案!
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/382366.html
上一篇:xarray中的查找表?
