【问题标题】:MySQL - How do I relate a custom table bi-directionally with user and usermeta tables? - WordpressMySQL - 如何将自定义表与用户表和用户元表双向关联? - WordPress
【发布时间】:2020-09-16 06:52:31
【问题描述】:

我正在使用 Wordpress、PhpMyAdmin、MySQL。 我对 SQL 和数据库也很陌生,所以请多多包涵。

我有一个自定义数据表(这是用户信息的主表),我想将它与 wp_users 和 wp_usermeta 表双向关联——这意味着如果用户更新了他们的个人资料(用户或 Usermeta 表)然后自定义数据表将自动更新,而无需我手动输入他们更新的信息。

同样,如果我编辑自定义数据表,我希望用户和 Usermeta 中的相关信息自动更新。

我尝试为我的脑海中的内容绘制一个粗略的图表。 Diagram of data handling

当前的系统很糟糕,很难维护。另一个问题是有许多 SQL 报告使用当前的自定义数据表。我知道我正在寻找的解决方案很可能意味着创建一个全新的表。没关系。

       User
–––––––––––––––––––
| ID  | username  |
|–––––+–––––––––––|
| 376 | John      |
| 377 | Paul      |
| 378 | Ringo     |
–––––––––––––––––––

       Usermeta
–––––––––––––––––––––––––––––––––––––––––––––
| meta_id | user_id | meta_key | meta_value |
|–––––––––+–––––––––+––––––––––+––––––––––––|
| 8       | 1       | job      | Keys       |
| 102     | 2       | job      | Vocals     |
| 203     | 3       | job      | Drums      |
–––––––––––––––––––––––––––––––––––––––––––––

       Custom_Table
––––––––––––––––––––––––––––––––––––––
| ID | username  | job     | user_ID |
|––––+–––––––––––+–––––––––+–––––––––|
| 1  | John      | Keys    | 376     |
| 2  | Paul      | Vocals  | 377     |
| 3  | Ringo     | Drums   | 378     |
––––––––––––––––––––––––––––––––––––––

基本上,这就是我的查询(除了我有更多的用户元行):

CREATE TABLE custom_table
    SELECT users.username,
    MAX(CASE WHEN meta_key = 'job' THEN meta_value ELSE NULL END) AS job,
    users.ID
    FROM wp_users as users, wp_usermeta as umeta
    WHERE umeta.user_id = users.ID

这会创建我想要的表,但如果任何表被更新,它不会在其他任何地方“同步”。这可能吗?会不会是通过某种触发器来完成的(我还是不熟悉触发器)?

【问题讨论】:

    标签: mysql sql wordpress join sql-view


    【解决方案1】:

    只需使用视图而不是表格。这使您可以始终了解实际数据的最新情况,无需任何维护成本(而且,就其价值而言,也无需存储成本)。

    create view custom_view as 
    select 
        u.username, 
        um.meta_value as job
        u.id as user_id
    from wp_users as users u
    left join wp_usermeta as umeta um on um.user_id = u.ID and um.meta_key = 'job'
    

    请注意您的原始查询:

    • 实际上是无效的 SQL(缺少group by 子句)

    • 如果事件有 group by 子句,它将过滤掉没有工作的用户(这可能不是你想要的)

    • 不要使用老式的隐式连接;始终使用标准联接(在 from 子句中使用 on 关键字并且没有逗号)

    由于您只对每个用户的一个元键感兴趣,因此可以将查询重写为简单的join,无需聚合。

    【讨论】:

    • 感谢您的回答!是的,对不起,我遗漏了分组。最后我有code GROUP BY users.ID code ORDER BY users.ID 每个用户的单个元键仅用于示例。我正在使用的将需要大约 26 个元键。我也尝试过创建一个视图,但是当我试图查看视图或针对它运行任何东西时,phpmyadmin 总是停止并冻结。会不会是服务器问题?因此,我无法探索 Views 可以为我做什么
    【解决方案2】:

    您可以使用Updateable VIEW 来解决此问题:

    CREATE VIEW custom AS
      SELECT User.ID, User.username,
        CASE WHEN meta_key = 'job' THEN meta_value ELSE NULL END AS job
      FROM User INNER JOIN Usermeta ON Usermeta.user_id = User.ID
    

    demo on dbfiddle.uk

    要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。还有某些其他构造使视图不可更新。

    如果您需要其中一种结构,您只能create the VIEW 并且必须更新源表本身。视图始终与源表同步。

    【讨论】:

    • 感谢您的演示!有助于在行动中看到它。由于某种原因,当我创建视图时 PhpMyAdmin 冻结,我必须刷新和删除视图。会不会是服务器问题?在我的表格/视图中,需要有超过 2,000 个用户和大约 28-30 列数据。
    猜你喜欢
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 2015-07-03
    • 2013-08-01
    • 2017-10-22
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    相关资源
    最近更新 更多