【问题标题】:MySQL database join on non-unique indexMySQL数据库连接非唯一索引
【发布时间】:2023-03-08 22:07:01
【问题描述】:

每个用户都有一个可以管理的本地程序

  • 猫(名字,...)
  • 饲料(包含不同类型的饲料:液体,...)
  • “吃”列表包含猫吃过哪种类型的饲料(cat.nr、feed.nr、日期时间)时的信息

我将把这三个表导入 MySQL 数据库。 然后我想要一个 SELECT 语句来获取所有带有 cat.name、feed.name 和 date 的吃事件

问题是每个用户都可能分配了一个不唯一的 cat.nr 或 feed.nr(其他用户可能使用了相同的 nr)。这不是主索引,但我用它作为外键关系的索引,推荐吗?

为了处理这个问题,我向每个表添加了一个用户 ID 字段,并添加了一个用户表本身(包含 user.name、user.id) - 如何完成一条 SQL 语句,为 id 为 1 的用户返回所有吃事件例如?

这是一个好方法吗?

【问题讨论】:

    标签: mysql sql indexing


    【解决方案1】:

    听起来您只需要表格上的复合主键。例如,如果列 cat_nr 对于任何给定的 user_id 都是唯一的(并且 user_id 可能是唯一的),那么将它们组合起来就可以得到唯一的主键。您也可以通过这种方式连接表格(即在两列上)。

    select *
        from eat_event e
        inner join feed f on f.feed_nr = e.feed_nr and f.user_id = e.user_id
    

    完整的查询可能类似于:

    select e.event_date, e.event_type, u.user_name, c.cat_nr, f.feed_nr
        from eat_event e
        inner join feed f on f.feed_nr = e.feed_nr and f.user_id = e.user_id
        inner join cat c on c.cat_nr = e.cat_nr and f.user_id = e.user_id
        inner join [user] u on u.user_id = e.user_id
    

    我希望这会有所帮助。

    【讨论】:

    • 为什么括号中有 [user]?想象一下我想做你的完整查询,但只针对特定用户(id = 1),只添加到你的最后一行是否正确:“AND u.user_id = 1”?
    • @camel - '[user]' 周围的括号只是为了安全,因为在某些 SQL 版本中,'user' 是保留字。您问题的第二部分是正确的(大部分)。您将添加where u.user_id = 1 以获取该用户的所有eat_events 或添加where u.user_id = 1 and e.event_date = '2018-02-17'(取决于您的日期格式)以获取该用户当天的所有事件等。不要忘记“接受”这个作为答案如果它可以帮助你。谢谢。
    • 谢谢!这是一个很好的答案,现在要接受这个。仍然存在一个问题,因为我认为这个问题通常与引用和加入非唯一键有关......有推荐的通用方法吗?
    • 在非唯一列上加入是完全可以接受的,您只会得到多个匹配项 - 有时您可能想要这样。但是在这种情况下,问题的核心(主键与否)是我们不知道哪只猫是哪只猫,但也不知道用户是谁。由于 Cat 和 Feed 表本质上是查找表,因此这种唯一标识每只猫或食物的组合也是自然主键。
    • 现在我想改进我的项目,我认为使用外键是个好主意。再次感谢您完全理解我的问题。也许您也知道如何正确设置带有限制的外键?正如您已经提到的,组合是实际的自然键...
    猜你喜欢
    • 1970-01-01
    • 2020-10-21
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    相关资源
    最近更新 更多