簡體   English   中英

MySQL substring 自加入

[英]MySQL substring to self 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

有沒有更好的方法來改變這種方法或使用加入? 謝謝!!!

內部聯接:

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;

如果有幫助,請將其標記為已接受的答案!

您對表名和列名的使用不一致 -

表 - 示例數據中的PeopleFood ,但您在查詢中引用peopleFood

列 - 示例數據中的PeopleIdFoodId ,但您在查詢中引用people_idfood_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;

兩個查詢之間的性能差異不太可能很明顯,並且可能會認為在您的版本中使用子查詢的意圖更清晰。

應刪除PeopleFood表上的代理鍵ID ,取而代之的是people_idfood_id上的復合“自然”主鍵。

關系表中無用代理鍵的成本

暫無
暫無

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

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