Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql与另一个表左连接时,只选择一列中的唯一值_Mysql_Select_Distinct - Fatal编程技术网

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个左连接”!!这并不一定是坏事。这取决于您是否使用适当的索引创建了表。如果你有这个问题,你不会有任何麻烦。