Mysql MariaDB:带有连接的复杂查询

Mysql MariaDB:带有连接的复杂查询,mysql,mariadb,Mysql,Mariadb,我试图让所有的用户有一个以上的衣服,但没有得到正确的结果 select us.id from users as us inner join user_clothes as uc1 ON (uc1.userId = us.id) inner join clothes as cl on (cl.id = uc1.clothesId) inner join u

我试图让所有的用户有一个以上的衣服,但没有得到正确的结果

select us.id from users as us
                        inner join user_clothes as uc1 ON (uc1.userId = us.id)
                        inner join clothes as cl on (cl.id = uc1.clothesId)
                        inner join user_clothes as uc2 on (cl.id = uc2.clothesId)
                        HAVING COUNT(uc2.clothesId) > 0

有什么想法吗?

您似乎对用户衣服做了不必要的加入,并且缺少了一个
GROUP BY
子句,因此:

select us.id from users as us
inner join user_clothes as uc1 ON (uc1.userId = us.id)
inner join clothes as cl on (cl.id = uc1.clothesId)
GROUP BY us.id
HAVING COUNT(distinct uc1.clothesId) > 0

似乎您对用户进行了不必要的连接,并且缺少了一个
GROUP BY
子句,因此:

select us.id from users as us
inner join user_clothes as uc1 ON (uc1.userId = us.id)
inner join clothes as cl on (cl.id = uc1.clothesId)
GROUP BY us.id
HAVING COUNT(distinct uc1.clothesId) > 0

由于您已加入用户表两次,因此该表中的每条记录将被计数两次。虽然您可以这样做:

select us.id from users as us
    inner join user_clothes as uc1 
      ON (uc1.userId = us.id)
    inner join user_clothes as uc2 
      ON (uc2.userId = us.id
          AND uc2.clothesId<>uc1.clothesId)

由于您已加入用户表两次,因此该表中的每条记录将被计数两次。虽然您可以这样做:

select us.id from users as us
    inner join user_clothes as uc1 
      ON (uc1.userId = us.id)
    inner join user_clothes as uc2 
      ON (uc2.userId = us.id
          AND uc2.clothesId<>uc1.clothesId)

您可以大大简化查询。实际上,您不需要任何
加入
s,只需要
分组方式

select uc.userId
from user_clothes uc
group by uc.userId
having min(uc.clothesId) <> max(uc.clothesId);
选择uc.userId
来自用户(u)
按uc.userId分组
具有最小(uc.CloseSid)和最大(uc.CloseSid);
此查询所需的所有信息都在
user\u
表中


注意:您也可以使用
having count(distinct uc.clothesId)>1
<代码>计数(不同)通常是一个更昂贵的操作。比较最小值和最大值做了同样的事情。

您可以大大简化查询。实际上,您不需要任何
加入
s,只需要
分组方式

select uc.userId
from user_clothes uc
group by uc.userId
having min(uc.clothesId) <> max(uc.clothesId);
选择uc.userId
来自用户(u)
按uc.userId分组
具有最小(uc.CloseSid)和最大(uc.CloseSid);
此查询所需的所有信息都在
user\u
表中


注意:您也可以使用
having count(distinct uc.clothesId)>1
<代码>计数(不同)通常是一个更昂贵的操作。比较最小值和最大值的作用是相同的。

首先添加
GROUP by us.id
谢谢,@AgRizzo。这确实是一个良好的开端<代码>美国分组。id不起作用,但
uc2分组。CloseSid
起作用。:)我怀疑你没有从按
CloseSid
分组中得到正确的结果,这似乎很奇怪。从添加我们的
分组开始。id
谢谢,@AgRizzo。这确实是一个良好的开端<代码>美国分组。id不起作用,但
uc2分组。CloseSid
起作用。:)我怀疑您没有通过
CloseSid
进行分组得到正确的结果,这似乎很奇怪。我认为应该是
uc.userID
我认为应该是
uc.userID