繁体   English   中英

当与另一张表联接时,MySQL SELECT仅在一列中具有唯一值

[英]Mysql SELECT only unique values in one column when left joined with another table

这是查询:

SELECT a.id, a.userName,if(o.userId=1,'C',if(i.userId=1,'I','N')) AS relation 
       FROM tbl_users AS a 
       LEFT JOIN tbl_contacts AS o ON a.id = o.contactId 
       LEFT JOIN tbl_invites AS i ON a.id = i.invitedId 
  ORDER BY relation

这将返回如下输出:

+----+--------------+-------------+
| ID | USERNAME     | RELATION    | 
+----+--------------+-------------+
|  1 |          ray |           C | 
+----+--------------+-------------+
|  2 |         john |           I | 
+----+--------------+-------------+
|  1 |         ray  |           N | 
+----+--------------+-------------+

我需要通过检查ID是否重复来从选择查询中删除第三行。 优先级如下:

C-> I->N。因此,由于已经有一个带有C的“射线”,因此我不希望再次带有I或N。

我尝试添加distinct(a.id),但是它不起作用。 我该怎么做呢?

为什么DISTINCT对此不起作用?

根据给出的规格,您要做的就是按ID和用户名分组,然后选择可以找到的最低关系值(因为C < I < N

SELECT a.id, a.userName, MIN(if(o.userId=1,'C',if(i.userId=1,'I','N'))) AS relation 
    FROM tbl_users AS a 
    LEFT JOIN tbl_contacts AS o ON a.id = o.contactId 
    LEFT JOIN tbl_invites AS i ON a.id = i.invitedId 
GROUP BY a.id, a.username

如本手册页所示,有多种方法可以获取分组的最大值/最小值。

如果不能通过字母顺序定义行的顺序那么最适合您的是第一个。

在这种情况下,如果期望的顺序是zam(请参阅Rams的注释),则需要FIELD()函数。

所以你的答案是

SELECT 
a.id, 
a.userName,
if(o.userId=1,'C',if(i.userId=1,'I','N')) AS relation 
FROM tbl_users a
LEFT JOIN tbl_contacts AS o ON a.id = o.contactId 
LEFT JOIN tbl_invites AS i ON a.id = i.invitedId 
WHERE 
if(o.userId=1,'C',if(i.userId=1,'I','N')) = (
    SELECT 
    if(o.userId=1,'C',if(i.userId=1,'I','N')) AS relation 
    FROM tbl_users aa
    LEFT JOIN tbl_contacts AS o ON aa.id = o.contactId 
    LEFT JOIN tbl_invites AS i ON aa.id = i.invitedId 
    WHERE aa.id = a.id AND aa.userName = a.userName
    ORDER BY FIELD(relation, 'N', 'I', 'C') DESC 
    LIMIT 1
)

注意,您也可以像ORDER BY FIELD(relation, 'C', 'I', 'N')使它更具可读性/直观性。 我反过来说,因为如果您可能在关系中使用“ X”,那么由于未将X指定为参数,因此FIELD()函数将返回0。 因此它将在'C'之前排序。 通过对参数进行降序排序和转折,就不会发生这种情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM