使用mySQL连接选择相似的信息

时间:2014-04-18 10:35:22

标签: mysql sql

写一个难题,我担心它没有解释太多!

基本上我有一张桌子,我们称之为链接

链接由这些列组成(我将添加测试数据,分开查看):

linksid | folderid | link
   1            1        www.example.com
   2            1        www.anotherexample.com

   3            2        www.example.com
   4            2        www.anotherexample.com
   5            2        www.auniquewebsite.com

现在我想要做的是从folderid 2获取唯一网站时,因为该文件夹中有2个链接也存在于folderid 1中 - 我想为用户创建一个建议。

到目前为止,我有:

  SELECT b.folderid, b.link FROM Links b

  LEFT OUTER JOIN Links a 

  ON  a.link = b.link AND  a.folderid <> b.folderid

  WHERE (a.folderid = 1)

但是这个查询只会显示这些结果,因为没有选择器可以对类似的匹配做任何事情:

linksid | folderid | link
   1            1        www.example.com
   2            1        www.anotherexample.com

   3            2        www.example.com
   4            2        www.anotherexample.com

我一直在尝试其他一些选择器(比如和a.link IS null),但它们都没有带来任何结果。理想情况下,我希望获得唯一的链接,并且只有当同一文件夹中的至少2个链接与搜索到的文件夹相匹配时

我觉得我是从错误的角度接近这个,任何人都有任何提示让我朝着正确的方向前进?

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望folder = 2的行不存在于folder = 1中。以下是使用left outer join的一种方法:

select l2.*
from Links l2 left outer join
     Links l1
     on l2.link = l1.link and
        l1.folder = 1
where l2.folder = 2 and l1.link is null;

编辑:

如果你想要所有&#34;无与伦比的&#34;文件夹的链接匹配文件夹1的所有链接,然后查询更复杂。以下内容获取包含l1所有链接的文件夹,然后可能还有更多:

select l2.folder
from links l1 left outer join
     links l2
     on l1.link = l2.link
where l1.folder = 1
group by l2.folder
having sum(l2.link is null) = 0;

要获取不在文件夹1中的所有链接,请使用子查询和更多逻辑:

select l.*
from (select l2.folder
      from links l1 left outer join
           links l2
           on l1.link = l2.link
      where l1.folder = 1
      group by l2.folder
      having sum(l2.link is null) = 0
     ) l2 join
     links l
     on l2.folder = l.folder
where not exists (select 1
                  from links l1
                  where l1.folder = 1 and
                        l1.link = l.link
                 );