1

そのため、私は比較的複雑なMySQLクエリを使用しており、理由を特定できませんでした。私はSQLに少し慣れていません。

クエリは、「問題のある」エントリのリストを「チケット」のデータベース、具体的には特定のの最新のチケットと結合することになっていますid。したがって、最新のチケットを取得するためにテーブル自体をJOIN実行する内部クエリがあります。ticketこれは正しく機能します。JOIN次に、データベースを使用してこの内部選択を試みますが、これが参加している列名であるにもかかわらず、problem重複する列名を取得します。id私の理解では、特定の列に参加するとき、それは重複として「カウント」されるべきではありません...

とにかく、クエリ:

SELECT * FROM `problem` P
LEFT JOIN (
    SELECT * FROM (
        SELECT id, MAX(ticket_id) AS ticket_id
        FROM `ticket`
        WHERE ticket_status = 'o'
        GROUP BY id
    ) AS MAX
    INNER JOIN (
        SELECT id, ticket_id, other_data, time_stamp FROM `ticket`
    ) CUR ON MAX.id = CUR.id AND MAX.ticket_id = CUR.ticket_id
) T ON P.id=T.id
WHERE
        P.since IS NOT NULL;

私が言ったように、私がこれをするなら:

SELECT * FROM (
    SELECT id, MAX(ticket_id) AS ticket_id
    FROM `ticket`
    WHERE ticket_status = 'o'
    GROUP BY id
) AS MAX
INNER JOIN (
    SELECT id, ticket_id, other_data, time_stamp FROM `ticket`
) CUR ON MAX.id = CUR.id AND MAX.ticket_id = CUR.ticket_id

それぞれの最新チケットの表を入手しますid

私がこれを修正しようとしたことの1つはSELECT MAX.* FROM (、単なるではなく修正することですSELECT * FROM (。これにより、重複する列名エラーは排除されますが、内部クエリはother_dataorまたはtime_stamp–列のみをid返しticket_idます。もちろん、これはそもそも参加の目的を打ち破ります。

4

2 に答える 2

1

フィールドASに対して行ったように、結合されたクエリのすべての列に を使用してエイリアスを与えてみてください。MAX(ticket_id)

例えば:

INNER JOIN (
    SELECT id AS cur_id, ticket_id as cur_ticket_id  ... etc
于 2012-10-08T21:02:51.483 に答える
1

以下のように id 列にエイリアスを設定します。

SELECT * FROM `problem` P
LEFT JOIN (
    SELECT * FROM (
        SELECT id AS max_id, MAX(ticket_id) AS ticket_id
        FROM `ticket`
        WHERE ticket_status = 'o'
        GROUP BY max_id
    ) AS MAX
    INNER JOIN (
        SELECT id AS cur_id, ticket_id, other_data, time_stamp FROM `ticket`
    ) CUR ON MAX.max_id = CUR.cur_id AND MAX.ticket_id = CUR.ticket_id
) T ON P.id=T.max_id
WHERE
        P.since IS NOT NULL;

重複を避けるために必要な列を選択するだけでよいとコメントに書きましたが、質問の著者は、私が外部選択を意味していることを理解し、内部選択について話していました。私がそれを正しく書いたことを願っています、テストしませんでした。

SELECT * FROM `problem` P
LEFT JOIN (
    SELECT CUR.id, CUR.ticket_id, CUR.other_data, CUR.time_stamp FROM (
        SELECT id, MAX(ticket_id)
        FROM `ticket`
        WHERE ticket_status = 'o'
        GROUP BY max_id
    ) AS MAX
    INNER JOIN (
        SELECT id, ticket_id, other_data, time_stamp FROM `ticket`
    ) CUR ON MAX.max_id = CUR.cur_id AND MAX.ticket_id = CUR.ticket_id
) T ON P.id=T.id
WHERE
        P.since IS NOT NULL;
于 2012-10-08T21:03:51.053 に答える