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 中,没有参考。

我的问题出现在我试图创建的 UNION 中,以将这些引用的票证提取到与数据库的典型票证列表相同的结果中。

例如,我的普通查询看起来像一个数据库(从众多 JOIN 中超级简化):

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

以下是我尝试过的一些尝试,每个尝试都有围绕 UNION 或 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 子句都适用于这两个集合,因为它们都应该作为一个结果出现。

4

1 回答 1

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
于 2013-10-31T23:14:51.250 回答