2013-10-31 42 views
0

我想在数据库中制作票据参考系统。这些票据在主表中被区分为单独的“数据库”,并且我有一个辅助表格指向该表格以便其他数据库能够引用另一个数据库的票据。引用加入

的示例方案:

`tickets` 
------------------------------------------- 
| ticket_id | ticket_cid | ticket_database| 
------------------------------------------- 
|  1 |   1 |    1 | 
|  2 |   1 |    2 | 
|  3 |   1 |    3 | 
------------------------------------------- 

`tickets_references` 
-------------------------------------- 
| ref_id | ref_ticket | ref_database | 
-------------------------------------- 
|  1 |   1 |   2 | 
|  2 |   3 |   1 | 
-------------------------------------- 

这让我保持独立的“数据库”,但随后作出特殊情况下的一票出现在另一个数据库。在这个例子中,每个数据库都有一张票。票#1将独占地显示在数据库#1中,但是随后该参考使其也出现在数据库#2中。票#3显示在数据库#3中,但也显示为数据库#1中的参考。票#2只显示在数据库#2中,没有引用。

我的问题来到联盟我试图创建将这些引用的票证作为数据库典型的票证列表拉入相同的结果。

例如,我的正常查询看起来像一个数据库(从众多的超简化的连接):

SELECT t.* 
FROM tickets 
WHERE t.ticket_database = 1 

这里有一些尝试我想,每四周或者工会或WHERE语法错误:

SELECT 
    (SELECT t.* 
    FROM tickets AS t 
    ) 

    UNION ALL 

    (SELECT t.* 
    FROM tickets_references AS r 
    LEFT JOIN tickets 
     ON r.ref_ticket = t.ticket_id 
    ) 

WHERE t.ticket_database = 1 
ORDER BY t.ticket_opened 



SELECT * 
    FROM (SELECT t.* 
     FROM tickets AS t 

     UNION ALL 

     SELECT t.* 
     FROM tickets_references AS r 
     LEFT JOIN tickets AS t 
      ON r.ref_ticket = t.ticket_id 

    ) 

WHERE t.ticket_database = 1 
ORDER BY t.ticket_opened 

在我当前的代码结构中,WHERE作为最后一个条款是非常重要的,如果可能的话,因为它被附加到各种条件中。我当然也需要一种方法让我的所有WHERE子句适用于这两个集合,因为它应该全部作为一个结果出现。

回答

1

不看我像你需要一个UNION:

SELECT DISTINCT t.* 
FROM tickets t 
LEFT JOIN tickets_references tr ON tr.ref_ticket = t.ticket_id 
WHERE t.ticket_database = 1 OR (tr.ticket_database IS NOT NULL AND tr.ticket_database = 1) 
ORDER BY t.ticket_opened 
+0

辉煌!我从来没有想过做一个简单的JOIN,因为我实际上并没有从参考表本身选择数据。我现在看到它是如何工作的,它的工作原理与我需要的一样,谢谢! – Demonslay335