0

ticket と ticket_custom の 2 つのテーブルがあります。
テーブルの配置はこんな感じ。代替テキスト

状態を変更できる Web インターフェイスがあります (テーブル ticket_custom の値) Web インターフェイスは、元のエントリを更新する代わりに、新しいエントリを追加します。

ticket  name    value
1   state   Ready for Final Verification
2   state   Ready for Final Verification
1   state   Verified                      

最後の行が追加されます

そのため、クエリを変更する必要があります。

   SELECT p.value AS __color__,
   id AS ticket, summary, component, version, c.value AS state, milestone, t.type AS type, 
   owner, status,
   time AS created,
   changetime AS _changetime, description AS _description,
   reporter AS _reporter
  FROM ticket t,  ticket_custom c
  LEFT JOIN enum p ON p.name = t.priority AND p.type = 'priority' AND id = c.ticket
  WHERE status <> 'closed' AND id = c.ticket
  ORDER BY CAST(p.value AS int), milestone, t.type, time, c.ticket 

クエリは両方のエントリを返すようになりました。where句にネストされたselectを追加しようとしました。

SELECT g.ticket
FROM ticket_custom g
WHERE g.ticket = id
ORDER BY g.ticket DESC LIMIT 1

そう -

SELECT p.value AS __color__,
   id AS ticket, summary, component, version, c.value AS state, milestone, t.type AS type, 
   owner, status,
   time AS created,
   changetime AS _changetime, description AS _description,
   reporter AS _reporter
  FROM ticket t,  ticket_custom c
  LEFT JOIN enum p ON p.name = t.priority AND p.type = 'priority' AND id = c.ticket
  WHERE status <> 'closed' AND id = c.ticket and (
         SELECT g.ticket
         FROM ticket_custom g
         WHERE g.ticket = id
         ORDER BY g.ticket DESC LIMIT 1 )
  ORDER BY CAST(p.value AS int), milestone, t.type, time, c.ticket

明らかに私は何か間違ったことをしています。

4

3 に答える 3

2

これは、クエリの問題というよりも設計上の問題のようです。ticket_custom テーブルから 1 つのレコードのみを返すことは可能ですが、それがどのレコードになるかを判断する方法はありません。サンプル テーブル チケット 1 には、「Ready for...」と「Verified」の値がありますが、どちらが最初に発生したかを示すものはありません。論理的には、「Ready for...」が最初に発生しました。

この問題を修正する最も簡単な方法は、タイムスタンプまたは増分 ID フィールドを追加することです。次に、サブクエリで最新のエントリ (最新のタイムスタンプまたは最大の ID) を選択できます。

于 2009-04-24T21:56:11.037 に答える
1

少なくとも 1 つのチケットがあると仮定すると、代わりに次のようにすることができます。

SELECT MAX(g.ticket) FROM ticket_custom g WHERE g.ticket=id

それを JOIN またはネストされた SELECT などに変換できます。

id=c.ticket id=MAX(c.ticket) を変更します

しかし、あなたの WHERE & LEFT JOIN をチェックしてください。そこには奇妙なものがいくつかあります。

于 2009-04-24T19:16:16.053 に答える
0

データベース スキーマを動的にしないでください (つまり、「テーブル駆動型」)。これは賢明な設計パターンではありません (私は経験から知っています)。追加の属性を作成する前にわずかな労力しか節約できませんが、その後、クエリの作成とそれらを実行するために必要なデータベース処理の両方で追加のオーバーヘッドが発生します。

状態 ID 列をチケット テーブルに追加し、状態が変化したときにそれを更新するだけです。州名を格納するための参照テーブルを作成します。その後、クエリは非常に単純になり、データベース エンジンが小さな参照テーブルへのインデックス付き結合を行うための労力が少なくて済みます。

于 2009-04-24T23:44:12.870 に答える