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 で小計などの「ブレイク オン」を行うためにさらに操作を行いますが、脱線します。