Php 生成一条SQL语句,根据结果中一列的内容动态选择内部联接

Php 生成一条SQL语句,根据结果中一列的内容动态选择内部联接,php,mysql,sql,Php,Mysql,Sql,我有以下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_decry

我有以下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 ";
它可以工作,但我需要在
customers
vendors
上添加一个内部联接,这取决于
cust\u vend\u type
列的内容是“1”(客户)还是“2”(供应商),然后在“1”或“2”时抓取
customers\u comp\u name

期待选择最好的解决方案或提出有用的建议

更新

这是用下面@ciaran的响应更新的代码。问题是,它似乎返回了一个空的resultset,即使我知道有符合条件的记录

$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 ";

不确定我做错了什么?

您必须对这两个表进行内部联接。并使用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

您需要外部联接,然后使用大小写(或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
i、 你的问题应该是

$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 ";

生成的操作上是否只有一个客户id?或者有供应商id和客户id。如果两者都是有效的id,也就是说没有空值。我怀疑只有一个customer_id?cust_vend_id表示vendors表的vendor_id或customers表的cust_id,具体取决于cust_vend_type是1还是2。不要使用mysql_u*,而是使用mysqli或PDO。感谢我最近将大部分网站转换为使用PDO。这是一个很快也将被转换的遗留查询。谢谢您的示例。将对其进行播放并报告。生成的\u操作。客户\u id似乎不存在,即使您将其替换为客户\u供应商\u id,此SQL将不会返回任何内容,除非客户和供应商中都存在客户\u供应商id的条目。似乎在@Ciaran下工作,但将进一步测试它(需要稍微更正列名。抱歉,user4035&@Ciaran,已经取消选择了答案,因为还没有找到答案!我发现的问题是,除了cust_vend_type为1或2之外,它还可以为NULL!当它为NULL时,“as cust_vend_name”仍然需要返回,即使是空的,因为它稍后会被PHP响应(虽然是空的)。谢谢,很抱歉打扰你。那么你确实需要一个外部连接,但是有一个扩展的案例陈述,我已经修改了我的答案来反映这一点。对不起,Ciaran,你的解决方案是在我得到工作的选择答案之后出现的。你的解决方案看起来是另一个从另一个角度解决问题的好方案,因此+1我将我的问题更新为sh使用您的解决方案更新代码。它当前返回一个空结果集,这是不正确的。只是想知道您是否可以检查我对您的解决方案的实现,以确保我正确理解它。谢谢。您也复制了SELECT关键字。删除它,它就会工作。我修改了我的答案以显示这一点。@PeterSnow,Plz,Descent你的代码是一个最小的例子,它给出了一个错误。并告诉我们你使用的数据库内容和输入。你试图检索什么数据?很难深入到其他人的大代码中,试图理解它必须如何工作。谢谢各位。我看不到除了我更新的代码和你们的代码之间的格式差异,但是为了确保安全,我把你的文章放进去了,在你的第22行更正了一个小问题之后,现在,你的版本运行得非常好。非常感谢。