【问题标题】:MySQL substring to self joinMySQL子字符串自加入
【发布时间】:2022-01-17 02:02:49
【问题描述】:

我正在使用连接表定义两个表之间的关系。我想按许多重叠事物的顺序排列它们。目前,我们正在使用子查询,有没有办法使用连接获得相同的结果?

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

有没有更好的方法来改变这个方法或使用连接? 谢谢!!!

【问题讨论】:

  • 您列出了 3 个表,但您的查询只使用了第 4 个表。
  • @jarlh 谢谢你的回答。很抱歉,您能更简单地解释一下吗?

标签: mysql sql join subquery


【解决方案1】:

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

表 - 您的示例数据中包含 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 上的复合“自然”主键。

The Cost of Useless Surrogate Keys in Relationship Tables

【讨论】:

  • 非常感谢您的友好回复。你真是个天才。
【解决方案2】:

内连接:

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;

如果有帮助,请将其标记为已接受的答案!

【讨论】:

  • 欢迎来到 Stack Overflow。当代码附有解释时,它会更有帮助。 Stack Overflow 是关于学习的,而不是提供 sn-ps 来盲目复制和粘贴。请编辑您的问题并解释它如何回答所提出的具体问题。见【如何回答】stackoverflow.com/questions/how-to-answer)
  • 感谢您的回答。但是答案并没有按照我想要的方式出现.... Sql 错误首先发生.... 我想要的答案类似于 Result。
猜你喜欢
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多