Mysql查询3个表&用户元

时间:2018-06-18 21:15:09

标签: mysql wordpress join meta

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

用户

id       user_login       user_registered

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

usermeta

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    

我想在今天的日期仅在user_registered上选择每个用户的user_login,并使用usermeta表和member_subscription表的user_id加入他们的id,但仅限于member_subscription表中的状态is ='有效',还包括每个用户的相关元数据,所以我最终得到以下信息:

user_login     color      type

user1          blue       train
user2          red        car

我非常感谢任何帮助,因为我真的很难与这个人挣扎。

2 个答案:

答案 0 :(得分:1)

对于列出不同列中属性的Entity–attribute–value model又名EAV结构,您可以通过加入元表来使用基于属性的条件聚合,如

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

答案 1 :(得分:0)

我不确定这是否是最有效的方法,但如果您加入桌子两次,则可以根据您的必要条件轻松过滤掉。类似的东西:

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'