2013-10-28 76 views
1

我有一个(简单)的场景,是这样的:SQL查询与一个以上的线路选择外键行到主键表

文档表格

id | title | text 
    =========================== 
    1 | Title1 | "AAA" 
    2 | Title2 | "BBB" 
    3 | Title3 | "CCC" 

文档图片

id | doc_id | url 
    =================================================== 
    1 | 1  | "http://some.domain.com/1.jpg" 
    2 | 1  | "http://some.domain.com/2.jpg" 
    3 | 2  | "http://some.domain.com/3.jpg" 
    4 | 4  | "http://some.domain.com/3.jpg" 

让我们命名这些表documentsdoc_pictures。我试图创建一个查询,将返回所有具有多个图片的文档。在这个例子中,这意味着仅返回具有编号为1的文档。

限制和假设

  1. 表的两个是巨大的。因此复杂的查询可能需要太长时间。
  2. 我不关心该文档有多少外国图片行。我只关心它是否超过1.
  3. 我不介意输出的是文档的id还是来自图片表的行。
  4. 我不介意这些文件的只是一小部分(例如10份文件具有超过1点的画面,而不是所有具有超过1张图片的文件)

db是Mysql

回答

8

这可以用来获取文档ID。

select 
    doc_id, 
    count(1) 
from 
    doc_pictures 
group by 
    doc_id 
having 
    count(1) > 1 

然后你就可以使用这些ID的documents表中使用where in

事情是这样的:

select 
    * 
from 
    documents 
where 
    id in (
     select 
      doc_id     
     from 
      doc_pictures 
     group by 
      doc_id 
     having 
      count(1) > 1 
    ) 
0
select doc_id 
from doc_pictures 
group by doc_id 
having count(distinct url) > 1; 
+0

这并没有为我工作。 – Pistos

+0

是什么问题? – muhmud

+0

它没有返回正确的结果。上面的投票答案是。 – Pistos