sql自联接表删除重复的行

Sha*_*ski 19 mysql sql

我有下表:

???????????????????????
? USERID ? LANGUAGEID ?
???????????????????????
?      1 ?          2 ?
?      1 ?          7 ?
?      1 ?          8 ?
?      2 ?         10 ?
?      2 ?          3 ?
???????????????????????
Run Code Online (Sandbox Code Playgroud)

现在我想为每个用户创建所有可能的语言对,这意味着我希望结果集为:对于用户1:(2,7),(7,8),(2,8)

对于用户2:(10,3)

这样做我已经完成了以下查询:

SELECT a.userId , a.LanguageId, b.LanguageId
FROM knownlanguages a, knownlanguages b  
WHERE a.userID=b.userID  
AND a.LanguageId<>b.LanguageId
Run Code Online (Sandbox Code Playgroud)

我得到的结果是用户1:(2,7),(7,8),(2,8),(7,2),(8,7),(8,2)

对于用户2:(10,3),(3,10)

(10,3)和(3,10)之间没有区别

如何删除重复的行?

TNX

dan*_*era 25

使用您的标识符:

SELECT a.userId , a.LanguageId, b.LanguageId
  FROM knownlanguages a inner join knownlanguages b  
    on a.userID=b.userID and a.LanguageId < b.LanguageId
Run Code Online (Sandbox Code Playgroud)

测试:Fot表:

create table t ( u int, l int);

insert into t values 
(    1,               2),
(    1,               7),
(    1,               8),
(    2,               10),
(    2,               3);
Run Code Online (Sandbox Code Playgroud)

查询是:

select t1.u, t1.l as l1, t2.l as l2
from t t1 inner join t t2
   on t1.u = t2.u and t1.l < t2.l
Run Code Online (Sandbox Code Playgroud)

(结果)

  • 惊人的干净和简单!只需添加 **`a.LanguageId &lt; b.LanguageId`**,即可删除所有重复项。 (3认同)

Joh*_*Woo 6

SELECT  userId,\n        LEAST(LANG_ID1, LANG_ID2) ID1,\n        GREATEST(LANG_ID1, LANG_ID2) ID2\nFROM\n    (\n      SELECT a.userId, \n             a.LanguageId LANG_ID1, \n             b.LanguageId LANG_ID2\n      FROM   knownlanguages a, knownlanguages b  \n      WHERE  a.userID=b.userID  AND \n             a.LanguageId <> b.LanguageId\n    ) s\nGROUP BY userId, ID1, ID2\n
Run Code Online (Sandbox Code Playgroud)\n\n\n\n

输出,

\n\n
\xe2\x95\x94\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x97\n\xe2\x95\x91 USERID \xe2\x95\x91 ID1 \xe2\x95\x91 ID2 \xe2\x95\x91\n\xe2\x95\xa0\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa3\n\xe2\x95\x91      1 \xe2\x95\x91   2 \xe2\x95\x91   7 \xe2\x95\x91\n\xe2\x95\x91      1 \xe2\x95\x91   2 \xe2\x95\x91   8 \xe2\x95\x91\n\xe2\x95\x91      1 \xe2\x95\x91   7 \xe2\x95\x91   8 \xe2\x95\x91\n\xe2\x95\x91      2 \xe2\x95\x91   3 \xe2\x95\x91  10 \xe2\x95\x91\n\xe2\x95\x9a\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x9d\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者简单地说,

\n\n
  SELECT a.userId, \n         a.LanguageId LANG_ID1, \n         b.LanguageId LANG_ID2\n  FROM   knownlanguages a, knownlanguages b  \n  WHERE  a.userID=b.userID  AND \n         a.LanguageId < b.LanguageId\n
Run Code Online (Sandbox Code Playgroud)\n