[英]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.