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 つのチケットがあります。チケット #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 つの結果になるはずだからです。

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 に答える