Mysql-选择具有链接值的行

Mysql-选择具有链接值的行,mysql,Mysql,抱歉标题不好,不知道如何用一句话来形容它 下面是表格: id, user_id, task_id 我需要选择具有多个任务id的记录的用户id 一种伪码 从task_id=1和task_id=2的任务中选择user_id我想你的意思是你想要user_id的值,其中有一个task_id为1的任务和一个task_id为2的任务 您的解决方案不起作用,因为它正在查找任务id为1和任务id为2的任务(这是不可能的) 你需要: select a.user_id from tasks a where a.t

抱歉标题不好,不知道如何用一句话来形容它

下面是表格:

id, user_id, task_id
我需要选择具有多个任务id的记录的用户id 一种伪码


从task_id=1和task_id=2的任务中选择user_id

我想你的意思是你想要user_id的值,其中有一个task_id为1的任务和一个task_id为2的任务

您的解决方案不起作用,因为它正在查找任务id为1和任务id为2的任务(这是不可能的)

你需要:

select a.user_id from tasks a where a.task_id = 1 inner join 
    tasks b where b.user_id = a.user_id and b.task_id = 2

我想你的意思是你想要user_id的值,其中有一个task_id为1的任务和一个task_id为2的任务

您的解决方案不起作用,因为它正在查找任务id为1和任务id为2的任务(这是不可能的)

你需要:

select a.user_id from tasks a where a.task_id = 1 inner join 
    tasks b where b.user_id = a.user_id and b.task_id = 2

正如他们所说,给猫剥皮有很多方法。这里有一个:

要获取已分配多个任务且(至少)具有task_id 1和task_id 2的用户列表,请执行以下操作:

选择
用户id
从用户_tasks//或任何您的表调用
任务id在(1,2)中的位置
按用户id分组
具有计数(不同任务_id)=2

正如他们所说,给猫剥皮的方法有很多种。这里有一个:

要获取已分配多个任务且(至少)具有task_id 1和task_id 2的用户列表,请执行以下操作:

选择
用户id
从用户_tasks//或任何您的表调用
任务id在(1,2)中的位置
按用户id分组
具有计数(不同任务_id)=2

让我们获取任务为1或2的所有行,按用户分组,并仅显示具有不同于最大任务ID的最小任务ID的用户:

SELECT 
 user_id
FROM t 
WHERE task_id in (1, 2)
GROUP BY user_id
HAVING MIN(task_id) <> MAX(task_id)
当我们应用一个分组操作时,所有这些行被压缩成每个用户一行,然后像MIN和MAX这样的东西就可以被使用并且有意义了。对于只有一行的用户,其最小值和最大值将是相同的数字。对于有20行值均为1的用户,它们的最小值和最大值也将相同。只有至少有一行为1且另一行为2的用户才会具有不同的最小值和最大值:

User MIN MAX
John 1   1
Jane 1   1
Jake 1   2     <-- the only user HAVING MIN <> MAX
Joel 2   2
用户最小值最大值
约翰11
简1 1

Jake 12让我们获取任务为1或2的所有行,按用户分组,仅显示具有不同于最大任务ID的最小任务ID的用户:

SELECT 
 user_id
FROM t 
WHERE task_id in (1, 2)
GROUP BY user_id
HAVING MIN(task_id) <> MAX(task_id)
当我们应用一个分组操作时,所有这些行被压缩成每个用户一行,然后像MIN和MAX这样的东西就可以被使用并且有意义了。对于只有一行的用户,其最小值和最大值将是相同的数字。对于有20行值均为1的用户,它们的最小值和最大值也将相同。只有至少有一行为1且另一行为2的用户才会具有不同的最小值和最大值:

User MIN MAX
John 1   1
Jane 1   1
Jake 1   2     <-- the only user HAVING MIN <> MAX
Joel 2   2
用户最小值最大值
约翰11
简1 1

Jake 1 2 Where task_id in(1,2)^^该解决方案更好,但正如您所知,您也可以执行
Where(task_id=1或task_id=2)
可能我的解释不清楚。我需要选择是否有一个
和另一个
,而不是
,因此同时有任务id 1和任务id 2的用户?@JeremyHarris,Right WHERE task_id in(1,2)^^该解决方案更好,但正如您所知,您也可以在其中执行
(task_id=1或task_id=2)
,也许我的解释不清楚。我需要选择是否有一个
和另一个
,而不是
,因此同时有任务id 1和任务id 2的用户?@JeremyHarris,对
这意味着你不能说x=1和x=2在哪里
我知道它,我为什么写
伪代码
,它是否适用于3个或更多的
任务id
?请参阅最后的注释-如果您想确保用户拥有3+那么它的形式是
,其中x在(a,list,of,things)组中,y在其中具有COUNT(DISTINCT x)=number of of of of of of of of of of things\u在\u列表中
-在这种情况下,IN包含4个things,COUNT DISTINCT应该是4(请注意,不应在列表中放置重复的值)
其中(1,2,2,3,4)中的x应具有计数(不同的x)=4而不是5的
(in列表中有4个独特的东西。这可能是显而易见的,但如果您从表中获取值,那么我确实想提到这一点。min/MAX将只确保用户至少有两个不同的值;如果您在(1,2,3)中有然后minmax可以给你只有1/2的用户。这很重要。要理解每种方法的局限性
,这意味着你不能说x=1和x=2在哪里
我知道它,这就是为什么我写了
伪代码
,它会与3个或更多的
任务id
一起工作吗?请看最后的评论-如果你想确保用户有3个以上的id,那么它的形式是
,其中(a,list,of,things)组中的x由y组成,具有COUNT(DISTINCT x)=列表中的things数量
——在这种情况下,IN包含4个things,COUNT DISTINCT应该是4(注意,不应该在列表中放置重复的值)
其中x IN(1,2,2,3,4)
应该具有COUNT(DISTINCT x)=4
而不是5(in列表中有4个独特的东西。这可能很明显,但如果您从表中获取值,我确实想提及这一点。min/MAX将仅确保用户至少有两个不同的值;如果您在(1,2,3)中有然后,minmax可以为您提供只有1/2的用户。了解每种方法的局限性非常重要