PHP MYSQL 在 PDO 中使用带有 CASE 和 Like 的 IN()

标签 php mysql pdo

我一直在尝试在我的 PDO sql 中实现 IN 语句。我已经使用 Using PDO with IN 中找到的解决方案成功实现了一个简单的解决方案

我的代码如下:

        $in_array = array("INTERNAL SITE","SUPPLIER");
        $in  = str_repeat('?,', count($in_array) - 1) . '?';
        $dbname = $_SESSION['dbname'];
        $conn = new PDO("mysql:host=localhost;dbname=$dbname", $db->id, $db->pass); 
       //connect to db
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);  
      //error modes  
        $sql = "SELECT cs_id, name, alias, fk_cs_type as type, is_active as active 
        FROM companysite WHERE ( fk_cs_type IN ($in))";
        $stmt = $conn->prepare($sql);   
        $stmt->execute($in_array); 

但是我的最终目标是还实现引用另外 2 个变量($srchBy 和 $srchField)的 CASE 和 Like 子句。当我尝试执行此操作时,出现 HY093 错误。我在这段代码中做错了什么?

        $in_array = array("INTERNAL SITE","SUPPLIER");
        $in  = str_repeat('?,', count($in_array) - 1) . '?';
        $srchBy = "ALIAS";
        $dbname = $_SESSION['dbname'];
        $conn = new PDO("mysql:host=localhost;dbname=$dbname", $db->id, $db->pass); 
       //connect to db
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);     
       //error modes     
        $sql ="SELECT cs_id, name, alias, fk_cs_type as type, 
               is_active as active FROM companysite
               WHERE ( fk_cs_type IN ($in)) AND 
              ((CASE WHEN $srchBy = 'ALIAS' THEN alias ELSE name END) 
              LIKE $srchField)"; 
        $stmt = $conn->prepare($sql);   
        $stmt->execute($in_array); 

最佳答案

目前,您的最终 SQL 将如下所示:

SELECT 
    cs_id, 
    name, 
    alias, 
    fk_cs_type as type, 
    is_active as active 
FROM 
    companysite
WHERE 
    ( fk_cs_type IN ('INTERNAL SITE','SUPPLIER')) AND 
    ((CASE WHEN 'ALIAS' = 'ALIAS' THEN alias ELSE name END) LIKE 'value_of_$srchField_variable')

除非您计划将语句转换为 MySQL View ,否则为什么不考虑使用 php 条件来构建更清晰、不太复杂的 SQL 语句。

$sql = "SELECT cs_id, name, alias, fk_cs_type as type, is_active as active 
        FROM companysite
        WHERE ( fk_cs_type IN ($in) )";

if($srchBy == 'ALIAS') 
{
    $sql.= " AND alias LIKE $srcField";
}
else
{
    $sql.= " AND name LIKE $srcField";
}

关于PHP MYSQL 在 PDO 中使用带有 CASE 和 Like 的 IN(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30996368/

相关文章:

php - 基于用户级别不同的mysql join查询

mysql - 计算整个集合数据库中唯一元素的数量

mysql全文索引性能问题

php - PDO 中的表单更新数据

php - Mysql行号函数无法与PDO php一起使用

php - 无法通过本地 php 实例连接到数据存储

php - 在 sprintf 中使用 IF ROW_COUNT() ?

php - 如何生成 24 位范围内的小数?

mysql - 需要帮助进行玩家评分计算的数据库/查询设计

php - mysql使用php安全快速的选择和插入