Mysql与另一个表左连接时,只选择一列中的唯一值
以下是查询:Mysql与另一个表左连接时,只选择一列中的唯一值,mysql,select,distinct,Mysql,Select,Distinct,以下是查询: 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
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 |
+----+--------------+-------------+
我需要从select查询中删除第三行,方法是检查id是否重复。优先次序如下:
C->I->N。既然已经有一个带C的“射线”,我不想再带I或N了
我尝试添加distinct(a.id),但它不起作用。我该怎么做
为什么DISTINCT不适用于此
从您提供的规格中,您只需按ID和用户名分组,然后选择您能找到的关系的最低值(因为
C
)
从您提供的规格中,您只需按ID和用户名分组,然后选择您能找到的关系的最低值(因为
C
)
如图所示,有多种方法可以获得分组最大值/最小值 如果不能按字母顺序定义行的顺序,则最适合您的是第一行 在这种情况下,如果所需的顺序是z-a-m(参见Rams的注释),则需要该函数 所以你的答案是
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
)
注意,您也可以像
按字段排序(关系'C','I','N')
那样进行操作,使其更具可读性/直观性。我反过来说,因为如果在关系中有可能有一个“X”,则FIELD()函数将返回0,因为没有将X指定为参数。因此,它将在“C”之前排序。通过降序排序和围绕参数顺序旋转,这是不可能发生的 有多种方法可以获得分组最大值/最小值,如图所示
如果不能按字母顺序定义行的顺序,则最适合您的是第一行
在这种情况下,如果所需的顺序是z-a-m(参见Rams的注释),则需要该函数
所以你的答案是
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
)
注意,您也可以像
按字段排序(关系'C','I','N')
那样进行操作,使其更具可读性/直观性。我反过来说,因为如果在关系中有可能有一个“X”,则FIELD()函数将返回0,因为没有将X指定为参数。因此,它将在“C”之前排序。通过降序排序和围绕参数顺序旋转,这是不可能发生的 你想怎么处理这个关系?1射线C/N
C和N有两种不同的关系。你确定要扔掉第三排吗?是的,我确定。优先级如下C->I->N。如果有一个C有一个用户ID,那么我不想要一个N有相同的用户ID。你能帮我吗?任何建议都将不胜感激。问题中没有提到,但你的观点很好。重新打开并将回答问题。您希望如何处理此关系?1射线C/N
C和N有两种不同的关系。你确定要扔掉第三排吗?是的,我确定。优先级如下C->I->N。如果有一个C有一个用户ID,那么我不想要一个N有相同的用户ID。你能帮我吗?任何建议都将不胜感激。问题中没有提到,但你的观点很好。重新打开并将回答问题。此查询不会花费很多时间吗?它有“4个左连接”!!这并不一定是坏事。这取决于您是否使用适当的索引创建了表。如果您有此查询,则不会产生任何问题。此查询不会花费很多时间吗?它有“4个左连接”!!这并不一定是坏事。这取决于您是否使用适当的索引创建了表。如果你有这个问题,你不会有任何麻烦。