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
。
列 - 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;
这两个查询之间的性能差异不太可能引人注意,并且可能有人认为您的子查询版本的意图更清晰。
PeopleFood
table 上的代理键 ID
应该被删除,以支持 people_id
和 food_id
上的复合“自然”主键.
我正在使用联接 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
。
列 - 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;
这两个查询之间的性能差异不太可能引人注意,并且可能有人认为您的子查询版本的意图更清晰。
PeopleFood
table 上的代理键 ID
应该被删除,以支持 people_id
和 food_id
上的复合“自然”主键.