MySQL 自连接子串

MySQL substring to self join

我正在使用联接 table 定义两个 table 之间的关系。我想按照许多重叠事物的顺序排列它们。目前,我们正在使用子查询,有没有办法使用 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

当table这样定义时,我想安排与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

有没有更好的方法改变这个方法或者使用join? 谢谢!!!

内部联接:

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;

如果有帮助,请采纳为采纳答案!

您在使用 table 和列名时不一致 -

表 - 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 table 上的代理键 ID 应该被删除,以支持 people_idfood_id 上的复合“自然”主键.

The Cost of Useless Surrogate Keys in Relationship Tables