【问题标题】:Using Array Values in Mysql Query在 Mysql 查询中使用数组值
【发布时间】:2013-09-25 20:51:46
【问题描述】:

我有一个查询要根据设置的参数选择有限的结果:

$query = $this->db->query ("
    SELECT 
        p.product_id, 
        p.quantity 
    FROM {$this->prefix}product p 
    LEFT JOIN {$this->prefix}product_to_category pc 
        ON (p.product_id = pc.product_id) 
    WHERE pc.category_id = '3' 
    AND p.status = '1' 
    ORDER BY p.quantity DESC 
    LIMIT 0, 4");

这将返回库存数量最多的 4 个产品,其中产品的 category_id = 3。

我想让它使用一个类别 ID 的数组,而不是一个静态的。即:

$categories = array(2, 6, 22, 33, 34, 83, 220, 222, 886, 897);

这可能吗?

【问题讨论】:

    标签: php mysql sql arrays


    【解决方案1】:

    您可以将数组转换为字符串并在查询中使用它。请注意,以下假设 $categories 已经是安全的并且不会包含恶意输入。如果不是这种情况,您需要清理输入。

    $categoriesClause = implode(",",$categories);
    
    $query = $this->db->query ("
        SELECT 
            p.product_id, 
            p.quantity 
        FROM {$this->prefix}product p 
        LEFT JOIN {$this->prefix}product_to_category pc 
            ON (p.product_id = pc.product_id) 
        WHERE pc.category_id IN ($categoriesClause)
        AND p.status = '1' 
        ORDER BY p.quantity DESC 
        LIMIT 0, 4");
    

    【讨论】:

    • 这也假设数组值已经被引用,不幸的是。你需要添加一个array_walk,然后才能覆盖它。
    • @Anthony 提问者的例子是一个整数列表。如果它是一个字符串数组,你可以使用$categoriesClause = "'" . implode("','",$categories) . "'";
    • (假设不为空)
    • OP 还在他的示例查询中将 category_id 包裹在单引号中,并且在我的经验中,用引号内爆始终是一场噩梦。看看我的回答!
    • 完美运行。有没有办法每个类别只返回一个产品,即:每个类别的最大数量?目前,查询仅按数量排序,因此我从同一类别中获取多个产品,因为它们的数量比不同类别的产品多。
    【解决方案2】:

    您可以使用IN 子句。

    WHERE pc.category_id in (2, 6, 22, 33, 34, 83, 220, 222, 886, 897);
    

    【讨论】:

      【解决方案3】:

      如果您的类别是文本而不是数字,则需要先引用它们,然后才能进入查询。

      您可以使用array_walk 来执行此操作,并在 PHP 5.3 及更高版本上使用匿名回调函数。您还可以继续并转义这些值以使它们在循环时安全:

      $categories = array(2, 6, 22, 33, 34, 83, 220, 222, 886, 897);
      
      array_walk($categories, function( &$category ) { 
           $category = $this->db->escape_string($category);
           $category = "'{$category}'";
       });
      
      $categories_inclause = implode(",", $categories);
      
      $this->db->query = "SELECT blah WHERE pc.category_id IN ($categories_inclause)";
      

      【讨论】:

      • 它们是静态设置的,所以这不是问题。谢谢。
      【解决方案4】:

      IN()implode() 结合使用:

      $query = $this->db->query ("
      SELECT 
          p.product_id, 
          p.quantity 
      FROM {$this->prefix}product p 
      LEFT JOIN {$this->prefix}product_to_category pc 
          ON (p.product_id = pc.product_id) 
      WHERE pc.category_id = IN(" . implode(',', $categories) . ") 
      AND p.status = '1' 
      ORDER BY p.quantity DESC 
      LIMIT 0, 4");
      

      【讨论】:

        猜你喜欢
        • 2014-04-07
        • 2014-01-16
        • 1970-01-01
        • 2010-11-09
        • 1970-01-01
        • 2018-11-10
        • 2018-03-14
        • 2017-12-11
        • 1970-01-01
        相关资源
        最近更新 更多