[英]Making an SQL statement which dynamically chooses INNER JOIN based on content of one column in results
我有以下SQL查詢:
$sql = "
SELECT
id,
refid,
action_id,
action_type,
co_user_id,
cust_vend_id,
cust_vend_type,
Aes_decrypt(cust_vend_name, '".DBKEY."') AS cust_vend_name,
Aes_decrypt(amount, '".DBKEY."') AS amount,
Aes_decrypt(action_date, '".DBKEY."') AS action_date,
Aes_decrypt(memo, '".DBKEY."') AS memo,
Aes_decrypt(trans_id, '".DBKEY."') AS trans_id,
entry_datetime,
part_id,
polarity
FROM
generated_actions
WHERE acc_type = 1
AND acc_id = $ref_id
AND action_type != 2
AND reverse_id IS NULL
ORDER BY generated_actions.action_id DESC ";
它的工作原理,但我需要添加一個INNER JOIN ON無論是customers
還是vendors
取決於內容是否cust_vend_type
列是一個“1”(客戶)或“2”(供應商),然后搶customers_comp_name
如果“1”或'vendors_comp_name '如果為'2'。
期待選擇最佳解決方案或提出有用的建議!
UPDATE
這是下面@ciaran的響應更新的代碼。 問題是,即使我知道有合格的記錄,它似乎仍在返回空結果集。
$sql = "
SELECT
ga.id,
ga.refid,
ga.action_id,
ga.action_type,
ga.co_user_id,
ga.cust_vend_id,
ga.cust_vend_type,
Aes_decrypt(ga.amount, '".DBKEY."') AS amount,
Aes_decrypt(ga.action_date, '".DBKEY."') AS action_date,
Aes_decrypt(ga.memo, '".DBKEY."') AS memo,
Aes_decrypt(ga.trans_id, '".DBKEY."') AS trans_id,
ga.entry_datetime,
ga.part_id,
ga.polarity,
SELECT CASE
WHEN
ga.cust_vend_type IS NULL
THEN
NULL
WHEN
ga.cust_vend_type = '1'
THEN
AES_DECRYPT(c.cust_comp_name, '".DBKEY."')
ELSE
AES_DECRYPT(v.vendor_comp_name, '".DBKEY."') END AS cust_vend_name
FROM
generated_actions ga
LEFT OUTER JOIN
customers c
ON
c.cust_id = ga.cust_vend_id
LEFT OUTER JOIN
vendors v
ON
v.vendor_id = ga.cust_vend_id
WHERE
ga.acc_type = 1
AND
ga.acc_id = $ref_id
AND
ga.action_type != 2
AND
ga.reverse_id IS NULL
ORDER BY
ga.action_id DESC ";
不確定我做錯了什么?
您需要外部聯接,然后使用CASE(或IF)選擇正確的名稱...
SELECT CASE WHEN generated_actions.cust_vend_type Is Null Then Null
WHEN generated_actions.cust_vend_type = '1'
THEN customers.customers_comp_name
ELSE vendors.vendors_comp_name END as Cust_Vend_Name
FROM generated_actions
LEFT OUTER JOIN customers ON customers.id=generated_actions.cust_vend_id
LEFT OUTER JOIN vendors ON vendors.id=generated_actions.cust_vend_id
即您的查詢應為...
$sql = "
SELECT
ga.id,
ga.refid,
ga.action_id,
ga.action_type,
ga.co_user_id,
ga.cust_vend_id,
ga.cust_vend_type,
Aes_decrypt(ga.amount, '".DBKEY."') AS amount,
Aes_decrypt(ga.action_date, '".DBKEY."') AS action_date,
Aes_decrypt(ga.memo, '".DBKEY."') AS memo,
Aes_decrypt(ga.trans_id, '".DBKEY."') AS trans_id,
ga.entry_datetime,
ga.part_id,
ga.polarity,
CASE WHEN ga.cust_vend_type IS NULL THEN NULL
WHEN ga.cust_vend_type = '1' THEN AES_DECRYPT(c.cust_comp_name, '".DBKEY."')
ELSE AES_DECRYPT(v.vendor_comp_name, '".DBKEY."') END AS cust_vend_name
FROM generated_actions ga
LEFT OUTER JOIN customers c ON c.cust_id = ga.cust_vend_id
LEFT OUTER JOIN vendors v ON ga.cust_vend_id
WHERE ga.acc_type = 1
AND ga.acc_id = $ref_id
AND ga.action_type != 2
AND ga.reverse_id IS NULL
ORDER BY ga.action_id DESC ";
您必須內部連接兩個表。 並使用IF語句:
SELECT
IF(generated_actions.cust_vend_type = 1, customers.customers_comp_name, vendors.vendors_comp_name)
FROM
generated_actions
INNER JOIN
customers
ON
customers.id=generated_actions.customer_id
INNER JOIN
vendors
ON
vendors.id=generated_actions.vendor_id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.