MYSQL 根据多行从表中选择
Posted
技术标签:
【中文标题】MYSQL 根据多行从表中选择【英文标题】:MYSQL Select from tables based on multiple rows 【发布时间】:2016-10-28 01:51:50 【问题描述】:我有一张名为user_meta
的表。在该表中,我有以下列:ID
、userID
、meta_key
、meta_value
我有另一个名为users
的表,其中唯一重要的列是ID
,我想将其与user_meta
表行进行比较。
users
表如下所示:
ID | email | etc...
1 | email@test.com |
5 | testa@a.com |
6 | .... |
7 | .... |
假设我有一个表(user_meta),看起来像:
ID | userID | meta_key | meta_value
2 | 1 | companyID | 2
3 | 1 | user_type | staff
4 | 5 | companyID | 2
5 | 5 | user_type | staff
6 | 6 | companyID | 4
7 | 6 | user_type | customer
我想为每个 userID
检索一行,但前提是公司 ID 和 user_type 正确。
我想检索与我将在查询中发送的具有相同 companyID 的所有用户,假设 $companyID=2,然后是所有具有user_type
='staff' 的用户。
所以 user_meta.userID 必须等于 users.ID,user_meta.companyID 必须等于 2,user_meta.user_type 必须等于 'staff'。
我想要一个符合这些条件的所有用户的列表。
返回结果为userID
1 & 5。他们都有companyID = 2
,并且都有user_type = staff
【问题讨论】:
提供这两个表的表结构,并且期望的结果来自您的示例数据 @NewbeeDev 我添加了 users 表,唯一重要的列是 ID。 users.ID = user_meta.userID 也许您想要查询的结果会帮助我们更多地了解您的问题。 @NewbeeDev 在底部添加了预期结果。 【参考方案1】:您需要为要匹配的每个属性加入一次user_meta
。
SELECT u.*
FROM users AS u
JOIN user_meta AS m1 ON u.id = m1.userID
JOIN user_meta AS m2 ON u.id = m2.userID
WHERE m1.meta_key = 'companyID' AND m1.meta_value = :companyID
AND m2.meta_key = 'user_type' AND m2.meta_value = 'staff'
【讨论】:
这似乎是我想要的工作方式。我将完成编码以确保。谢谢!【参考方案2】:不太确定您的问题。我假设这是您可能想要的:
select * from Users where ID in (
select userID from user_meta where (meta_key = 'companyID' and meta_value = 2) or (meta_key = 'user_type' and meta_value = 'staff')
);
【讨论】:
这将获得公司 2 中的每个人或员工,这并不要求他们两者兼有。 @Barmar 啊,是的,你是对的。我没答对问题 @PremRaj 是的,谢谢你的尝试,我知道这个问题有点令人困惑。 这其实是一个很常见的请求,这样的错误答案也很常见。【参考方案3】:SELECT `users`.`id`,
`Company`.`meta_value`,
`UserType`.`meta_value`
FROM `users`
JOIN `user_meta` `Company`
ON `Company`.`userid` = `users`.`id`
JOIN `user_meta` `UserType`
ON `UserType`.`userid` = `users`.`id`
WHERE `UserType`.`meta_value` = 'staff'
AND `Company`.`meta_value` = 2
https://gyazo.com/de8d9124418f65b993d708c80c309325
【讨论】:
以上是关于MYSQL 根据多行从表中选择的主要内容,如果未能解决你的问题,请参考以下文章