2012-03-15 114 views
0

我有一个包含两个ID的表。我想从第一个表中选择两个id,并从两个附加表中获得两行的结果集。也许我错过了这里显而易见的,当我开始使用两个id时,我如何抓取多行?MySQL中的两个字段在一个表中从其他表中选择两个结果行?

Table 1 = Intial SELECT 
id | document1_id | document2_id 

SELECT FROM table1 document_id1, document_id2 

Table 2 
document_id | document_title | document_description 

Table 3 
document_id | document_filename 

我想得到两个匹配document_id1和document_id2的结果行。这是我开始筑巢的地方。这一直没有奏效。我可以在这里做两个连接?

我希望看到实现的结果集是:

1 row from table 1 
table1_id, document1_id, document2_id 

2 rows from table 2 
document_title, document_description that matches document1_id AND 
document_title, document_description that matches document2_id 

2 rows from table 3 
document_filename that matches document1_id AND 
document_filename that matches document2_id 

我已经缩短表中实际的列数简单地说明一下,我希望能完成。首先,这看起来像是一个很好的数据设置?如果是,是否有一种简单的方法来选择数据?目前,我有一堆嵌套选择正在失控并且似乎适得其反。无论如何,一如既往的任何帮助或指导表示赞赏。谢谢。

回答

1

上面的答案并不完全给我我期望实现的结果。最终,这是我结束了工作。谢谢您的帮助。

SELECT 
    t1.document1_id, t1.document2_id, 
    t21.document_title as t21_title, t21.document_description as t21_description, 
    t22.document_title as t22_title, t22.document_description as t22_description, 
    t31.document_filename as t31_filename, 
    t32.document_filename as t32_filename 
FROM 
    Table1 t1 
    INNER JOIN Table2 t21 
     ON t21.document_id = t1.document1_id 
    INNER JOIN Table2 t22 
     ON t22.document_id = t1.document2_id 
    INNER JOIN Table3 t31 
     ON t31.document_id = t1.document1_id 
    INNER JOIN Table3 t32 
     ON t32.document_id = t1.document2_id 
0

也许会更好,这里使用union:

select t1.id, t1.document1_id as doc_id, t2.document_title, t2.document_description, t3.document_filename 
FROM table1 t1 
LEFT JOIN table2 t2 ON t2.document_id=t1.document1_id 
LEFT JOIN table2 t3 ON t3.document_id=t1.document1_id 
UNION 
select t1.id, t1.document2_id as doc_id, t2.document_title, t2.document_description, t3.document_filename 
FROM table1 t1 
LEFT JOIN table2 t2 ON t2.document_id=t1.document2_id 
LEFT JOIN table2 t3 ON t3.document_id=t1.document2_id 
0

根据还有什么你必须在表1,具有同一行中两个不同的文档ID可能不是一个好主意。但你可以尝试是联合子查询:

SELECT table2.*, table3.* 
    FROM (
    SELECT document_id1 AS document_id 
     FROM table1 
     WHERE id = ? 
    UNION ALL 
    SELECT document_id2 AS document_id 
     FROM table1 
     WHERE id = ? 
) table1a 
    INNER JOIN table2 ON table1a.document_id = table2.document_id 
    INNER JOIN table3 on table1a.document_id = table3.document_id 

不要在过程中的生产代码中使用*

0

像这样的东西似乎会做你想要的,没有任何嵌套的选择。

SELECT Table1.id, Table1.document1_id, Table1.document2_id, 
     Table2.document_title, Table2.document_description, 
     Table3.document_filename 
FROM Table1 JOIN Table2 ON Table2.document_id = Table1.document1_id OR 
          Table2.document_id = Table1.document2_id 
      JOIN Table3 ON Table3.document_id = Table2.document_id 
WHERE Table1.id = ?