0

私が達成しようとしているものと同様の例を見つけるのに苦労しています。私は3つのテーブルを持っています。1つのテーブルからリンクID番号を取得したいと思います。別のテーブルから同じIDを見つけて、そのテーブルの1番目のテーブルのID番号が一致する別の番号の列を追加したいと思います。次に、テキストである3番目のテーブルで、IDがメインID番号と一致するすべてのテキストをグループ化し、これらすべてを1回で返します。私の図は私が何を意味するかを示すはずです:

したがって、それ自体で結果を返す2つのクエリがありますが、Imはそれを1つの単一のクエリに組み込むのに苦労しています。

    SELECT ticket_charges.ticket_id
         , sum(ticket_charges.charge_time) AS Seconds
    FROM
      ticket_charges
    LEFT OUTER JOIN tickets
    ON ticket_charges.ticket_id = tickets.id
    GROUP BY
      ticket_charges.ticket_id
    , tickets.id

チケットID3の77と937が正しく追加されました!!

    SELECT tickets.id AS `Ticket Number`
         , left(tickets_messages.message, 500) AS `Ticket Message`
    FROM
      tickets
    INNER JOIN tickets_messages
    ON tickets.id = tickets_messages.id
    GROUP BY
      tickets_messages.ticket_id
    , tickets.id

メッセージは正しく結合されます。

メッセージの連結、select内の選択、グループ化するさまざまなメソッド、いくつかの合計などを試しましたが、両方のクエリで結果が正しく返される結果が得られないようです。 1つの単一クエリとして。「charge_time」からの結合された番号が非常に間違っていて、どの類似点とも一致しないか、「charge_time」に何百もの「メッセージ」と奇妙な番号が表示されます。

参考までに..これを試してみると、「サブクエリが1行以上返されました」というメッセージが表示されますが、これを実行する必要があると思いました。

    SELECT ticket_charges.ticket_id
        , sum(ticket_charges.charge_time) AS Seconds
    FROM
      ticket_charges
    LEFT OUTER JOIN tickets
    ON ticket_charges.ticket_id = tickets.id
       Where (SELECT left(tickets_messages.message, 500)
              FROM  
               tickets    
              INNER JOIN tickets_messages
              ON tickets.id = tickets_messages.id
              GROUP BY
               tickets.id)
    GROUP BY
     ticket_charges.ticket_id
    , tickets.id
4

2 に答える 2

2

本当に単一のクエリでそれを行う必要がある場合、解決策は、ジョイントの1つでサブクエリを実行することです。

SELECT t.id, t.person_id, SUM(tc.charge_time), mc.concat
FROM tickets t
INNER JOIN tickets_charges tc ON tc.ticket_id = t.id
INNER JOIN (
    SELECT ticket_id, GROUP_CONCAT(message SEPARATOR ' ') as concat
    FROM tickets_messages
    GROUP BY ticket_id) AS mc
  ON mc.ticket_id = t.id
GROUP BY t.id
于 2012-10-10T20:33:30.807 に答える
0

このクエリを試してください-

SELECT
  t.id,
  t.person_id,
  SUM(tc.charge_time) Seconds,
  GROUP_CONCAT(LEFT(tm.message, 20)) Message
FROM
  tickets t
LEFT JOIN ticket_charges ts
  ON ts.ticket_id = t.id
LEFT JOIN tickets_messages tm
  ON tm.ticket_id = t.id
GROUP BY
  t.id;

関数には長さの制限があるため、「LEFT(tm.message、20)」を使用したことに注意してください--group_concat_max_lenGROUP_CONCAT

于 2012-10-11T08:44:20.577 に答える