0

MySQL クエリを使用して Kayako Fusion の外部レポートを生成しているときに、奇妙で厄介な問題に遭遇しました。テーブル内のフィールドの 1 つに、41 または 40 の 2 つの値のいずれかを含むことができる「TEXT」フィールドが含まれています。エンド ユーザーがいずれかの値を選択しない場合、デフォルトは NULL です。(私はそれを変更することはできません)。

したがって、簡単なことをしようとすると:

WHERE swcustomfieldvalues.fieldvalue = '41'

次に、NULL (または '') 値を持つレコードも返します。

同じことが次の場合にも当てはまります。

WHERE swcustomfieldvalues.fieldvalue = '40'

NULL レコードも取得します (NULL を 40 として扱うため、これはある程度正確です。

簡単な参考として、値 40 は非課金作業、値 41 は課金対象作業です。

何が欠けていますか、または回避策はありますか?

スクリーンショット

以下は厄介な元の SQL ステートメントです。

SELECT
swtickets.ticketid AS `Ticket ID`,
swtickettimetracks.tickettimetrackid AS `Track ID`,
swtickets.ticketmaskid AS `TicketMASK`,
(
    SELECT
        swcustomfieldvalues.fieldvalue
    FROM
        swcustomfieldvalues,
        swcustomfields
    WHERE
        swcustomfieldvalues.customfieldid = swcustomfields.customfieldid
    AND swtickets.ticketid = swcustomfieldvalues.typeid
    AND swcustomfields.title = 'Member Company'
    ORDER BY
        swcustomfieldvalues.customfieldvalueid DESC
    LIMIT 1
) AS MemberCompany,
(
    SELECT
        swcustomfieldvalues.fieldvalue
    FROM
        swcustomfieldvalues,
        swcustomfields
    WHERE
        swcustomfieldvalues.customfieldid = swcustomfields.customfieldid
    AND swtickets.ticketid = swcustomfieldvalues.typeid
    AND swcustomfields.title = 'Member Name'
    ORDER BY
        swcustomfieldvalues.customfieldvalueid DESC
    LIMIT 1
) AS MemberName,
(
    SELECT
        swcustomfieldvalues.fieldvalue
    FROM
        swcustomfieldvalues,
        swcustomfields
    WHERE
        swcustomfieldvalues.customfieldid = swcustomfields.customfieldid
    AND swtickets.ticketid = swcustomfieldvalues.typeid
    AND swcustomfields.title = 'Chargeable'
    AND swcustomfieldvalues.fieldvalue = '41'
    ORDER BY
        swcustomfieldvalues.customfieldvalueid ASC
    LIMIT 1
) AS `Chg`,
swtickets.`subject` AS `Subject`,
swtickets.departmenttitle AS Category,
FROM_UNIXTIME(
    swtickettimetracks.workdateline,
    '%Y-%m-%d'
) AS `workDateline`,
FROM_UNIXTIME(
    swtickettimetracks.dateline,
    '%Y-%m-%d'
) AS `dateline`,
swtickettimetracks.timespent AS `Time Spent`,
swtickets.timeworked / 60 AS `Time Worked`
FROM
    swtickets
RIGHT OUTER JOIN swusers ON swtickets.userid = swusers.userid
INNER JOIN swuserorganizations ON swuserorganizations.userorganizationid = swusers.userorganizationid
INNER JOIN swtickettimetracks ON swtickettimetracks.ticketid = swtickets.ticketid
WHERE
    swuserorganizations.organizationname = 'Clarence Professional Offices'
AND (
    swtickets.ticketstatustitle = 'Closed'
    OR swtickets.ticketstatustitle = 'Completed'
)
AND swtickets.ticketid = '2895'
GROUP BY
    `Ticket ID`,
    `Track ID`

初心者なのでよろしくお願いします(;_;)

個々のサブセレクト (これは避けられません) を分解すると、特定のチケット「2895」に対して「41」の値を持つカスタムフィールド「課金可能」を取得するためのこの個々のサブセレクトが実際に機能することを証明できます! 見る:

SELECT
        swcustomfieldvalues.fieldvalue,
        swtickets.ticketid

    FROM
        swcustomfieldvalues,
        swcustomfields,
        swtickets
    WHERE
        swcustomfieldvalues.customfieldid = swcustomfields.customfieldid
    AND swtickets.ticketid = swcustomfieldvalues.typeid
    AND swcustomfields.title = 'Chargeable'
    AND swcustomfieldvalues.fieldvalue = '40'
    AND swtickets.ticketid = '2895'
    ORDER BY
        swcustomfieldvalues.customfieldvalueid ASC

このチケットは請求対象外であることがわかっているため、TRUE が返されます (40)。値を「41」(課金可能) に変更すると、False (レコードなし) が返されます。

全体の SQL ステートメント (オリジナル) は以下を返す必要があります: 日付範囲内で請求可能なすべてのチケット

チケットID/チケットマスク、トラックID、会員企業、会員名、有料? (40|41)、件名、カテゴリ、WorkDateline、Dateline、費やされた時間、および作業時間。

次に、PHP で小計などの「ブレイク オン」を行うためにさらに操作を行いますが、脱線します。

4

1 に答える 1