簡體   English   中英

制作一條SQL語句,該語句根據結果中一列的內容動態選擇INNER JOIN

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM