MYSQL 根据多行从表中选择

Posted

技术标签:

【中文标题】MYSQL 根据多行从表中选择【英文标题】:MYSQL Select from tables based on multiple rows 【发布时间】:2016-10-28 01:51:50 【问题描述】:

我有一张名为user_meta 的表。在该表中,我有以下列:IDuserIDmeta_keymeta_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 根据多行从表中选择的主要内容,如果未能解决你的问题,请参考以下文章

根据日期参数从表中选择周末或工作日数据

jquery根据选择值从表中填充文本输入

SQL Server:根据来自其他 2 个表的子查询从表中选择

根据复选框选中的属性从表中选择单元格值

想根据搜索字符串从表中搜索记录

从表中选择连续范围