我正在尝试为数据库中的故障单创建一个参考系统。故障单在主表中被区分为单独的“数据库”,并且我有一个辅助表,指向此表以便其他数据库引用另一个数据库的故障单。
示例方案:
`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子句都适用于这两个集合,因为它应该都是一个结果。
答案 0 :(得分: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