Mysql 查询 3 个表和用户元

Mysql query for 3 tables & user meta

我正在尝试创建一个 mysql 查询以将 3 table 条数据连接到一行中。但是,由于用户元 table 的布局方式,我遇到了一些问题。 table的结构如下:

用户

id       user_login       user_registered

1        user1            18/06/2018
2        user2            18/06/2018

用户元

user_id       meta_key       meta_value

1             color          blue
1             type           train
2             color          red
2             type           car

member_subscription

user_id       status

1             active  
2             active    

我想 select 每个用户的 user_login 仅在今天的日期 user_registered 并将他们的 ID 与用户元 [=42] 的 user_id 连接起来=] 和 member_subscription table 但仅在 member_subscription table 中的状态为 = 'active',并且还包括每个用户的相关元数据,因此我最终得到以下结果:

user_login     color      type

user1          blue       train
user2          red        car

非常感谢任何帮助,因为我真的很努力解决这个问题。

我不确定这是否是最有效的方法,但如果您加入 table 两次,它会很容易根据您的必要条件过滤掉。类似于:

SELECT u.user_login, um1.meta_value AS color, um2.meta_value AS type
FROM users u 
LEFT JOIN usermeta um1 
     ON um1.user_id=u.id
     AND um1.meta_key='color'
LEFT JOIN usermeta um2 
     ON um2.user_id=u.id
     AND um2.meta_key='type'
JOIN member_subscription ms 
     ON ms.user_id=u.id
WHERE ms.status='active'

对于 Entity–attribute–value model aka EAV 结构以在不同的列中列出属性,您可以通过加入您的元 table 来根据您的属性使用条件聚合,例如

SELECT u.id, 
       u.user_login, 
       MAX(CASE 
             WHEN m.meta_key = 'color' THEN m.meta_value 
             ELSE NULL 
           END) AS color, 
       MAX(CASE 
             WHEN m.meta_key = 'type' THEN m.meta_value 
             ELSE NULL 
           END) AS type 
FROM   users u 
       JOIN usermeta m 
         ON m.user_id = u.id 
       JOIN member_subscription ms 
         ON ms.user_id = u.id 
WHERE  ms.status = 'active' 
GROUP  BY u.id, 
          u.user_login 

Demo