データベース内のチケットの参照システムを作成しようとしています。チケットは、プライマリ テーブルで個別の「データベース」として区別されます。他のデータベースが別のデータベースのチケットを参照できるように、このテーブルを指すセカンダリ テーブルがあります。
スキームの例:
`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 つのチケットがあります。チケット #1 はデータベース #1 にのみ表示されますが、参照によってデータベース #2 にも表示されます。チケット #3 はデータベース #3 に表示されますが、データベース #1 にも参照として表示されます。チケット #2 は、参照なしでデータベース #2 に表示されるだけです。
私の問題は、これらの参照されたチケットをデータベースのチケットの典型的なリストと同じ結果にプルするために作成しようとしている UNION にあります。
たとえば、私の通常のクエリは 1 つのデータベースに対して次のようになります (多数の 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 句を両方のセットに適用する方法も必要です。これは、すべてが 1 つの結果になるはずだからです。