我正在尝试创建一个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
我非常感谢任何帮助,因为我真的很难与这个人挣扎。
答案 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
答案 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'