【问题标题】:MYSQL Views? Joining two tablesMYSQL 视图?连接两个表
【发布时间】:2011-08-14 19:46:27
【问题描述】:

我有两张桌子。 “用户”和“付费用户”

Paying_users 当然有更多关于付款的信息。

我正在寻找一种在插入时能够强制使用两个表通用的唯一用户名的方法。 因此,如果“Shelly”在“users”上,我将无法将“Shelly”插入“paying_users”。 这在 MYSQL 上可行吗?

【问题讨论】:

    标签: mysql join view


    【解决方案1】:

    您为什么不使用 users 作为主表并将 pay_users(我认为是用户的一部分)与用户的 id 相关联?那么,你就不会有重复的问题了。

    users: 
      id: ...
      name: ...
      other information
    
    paying_users:
      id: ...
      users_id: ...
      other information:
    

    【讨论】:

    • 但是如果雪莉在 pay_users 呢?我可能会不小心将她插入用户中并创建两个具有相同名称的用户
    • 我会把每个用户都放到用户中,或者如果用户或非付费用户,而不是创建一个表 user_data,您可以在其中存储用户的所有数据,而其他用户仅用于附加信息。如果付款是唯一的区别,您也可以将其存储在一个表中并使用布尔字段“付款”将它们彼此分开。决定哪个版本最适合您...
    【解决方案2】:

    Paying_users 仍然是用户,对吧?那么这将解决您的问题:

    users: 
      id: ...
      name: ...
      other information that relates to a user
      PRIMARY KEY: id
      UNIQUE KEY: name
    
    paying_users:
      id: ...
      other information that relates a paying user only
      PRIMARY KEY: id
      FOREIGN KEY: id
          REFERENCES users(id)
    
    • 有了这个结构,当你想添加paying_user时,你分两步完成:
      • 1 将他添加到表 users(因此他的 name 在所有用户中都是唯一的)
      • 2 将他的id 添加到表paying_users,以及仅与付费用户相关的其他数据。

    其他优势:

    • 当您有一个(简单)用户决定付款时,您只需执行第 2 步。

    • 当您有一个paying_user 的付款期限已过时,您只从paying_users 表中删除他的记录,因此他仍然是一个简单用户。

    【讨论】:

      【解决方案3】:

      我认为在 MySQL 中不可能做到这一点。如果可能,最好设计一个用户表。然后,您将为那些正在付款的客户创建一个包含用户 ID 和 pyament 信息的辅助表,并且您可以在必要时加入

      【讨论】:

        【解决方案4】:

        尝试将您的 INSERT 与 SELECT 结合使用。例如:

        INSERT INTO paying_users
        SELECT 'Shelly', 'other', 'column', 'values'
        WHERE (SELECT COUNT(1) FROM users WHERE username = 'Shelly') = 0
        

        我不确定,没有尝试过这个特定的结构,但您可能需要创建一个 1 行的虚拟表来选择您的数据:

        INSERT INTO paying_users
        SELECT 'Shelly', 'other', 'column', 'values'
        FROM (SELECT 1) AS dummy
        WHERE (SELECT COUNT(1) FROM users WHERE username = 'Shelly') = 0
        

        【讨论】:

        • 这里到底发生了什么?返回的 WHERE 是什么?我不熟悉这种语法。 SELECT 1 返回什么?有一个 (SELECT COUNT(1) FROM users WHERE username = 'Shelly') = 0 .... 你能解释一下吗?谢谢
        • 语句SELECT COUNT(1) FROM users WHERE username = 'Shelly' 将返回用户名为“Shelly”的用户数。该语句周围的括号会将结果插入到周围的 where 子句中,使其本质上是WHERE %matching_users% = 0。这将具有仅在没有匹配用户时返回一行的效果,因此仅在没有匹配用户时插入。但是,如果可以选择更改底层数据库设计,那么这并不是最好的方法。在那种情况下,我会选择 ypercube 的答案。
        猜你喜欢
        • 2012-09-03
        • 1970-01-01
        • 2011-04-27
        • 2011-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-14
        • 1970-01-01
        相关资源
        最近更新 更多