mysql查询3个表和用户meta

8qgya5xd  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(585)

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

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

会员订阅

user_id       status

1             active  
2             active

我只想在用户注册时选择每个用户的用户登录名,并将其id与usermeta表和member订阅表的用户id连接起来,但仅在member订阅表中的状态为“active”的情况下,还包括每个用户的相关元数据,因此我最终得到以下结果:

user_login     color      type

user1          blue       train
user2          red        car

任何帮助都是非常感谢的,因为我真的很努力与这一个。

yptwkmov

yptwkmov1#

我不确定这是否是最有效的方法,但是如果您两次加入表,就可以很容易地根据您的必要条件进行筛选。比如:

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'
ndh0cuux

ndh0cuux2#

对于实体-属性-值模型aka eav structure,要在不同的列中列出属性,可以使用基于属性的条件聚合,方法是像

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

演示

相关问题