-1

我们有一个包含数百万种产品和价格的数据库。我们试图在我们的 sql 语句中添加一个过滤器,以便我们可以缩小我们正在寻找的内容,然后将其显示在我们的表上。我们想要过滤的一些内容与定价有关,这给我们带来了问题。

由于我们的价格是相当动态的,我们目前使用 php 函数来实时计算我们的费用,而不是将它们存储在数据库中。我们通过函数传递当前价格,然后将其显示在表格中:

echo profit('99.99'); // output: 12.19

这样做的问题是我们无法使用我们的函数在查询中运行这些计算来查找结果:

$query = "SELECT * FROM `products` WHERE ".profit(."`price` + `shipping` + `acquisition` + `fees`".)." > 10 ";

有没有办法解决这个问题?我们是否需要遍历所有表值?我们试图避免这种情况,因为数据库太大了。谢谢你的帮助!

4

4 回答 4

2

您可以在 MySQL 中创建一个函数,并让该函数为您估算利润。

我不知道您的利润函数有多复杂,因为您没有显示代码。如果你的“利润”函数不断变化:你做错了。代码不应该一直在变化,你很可能应该改变它的设计。

无论如何,这里是如何在 MySQL http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html中创建函数

我会选择上述解决方案。您也可以继续并在指示利润的列处。每当利润可能发生变化时更新所述列。如果产品表有点大(注意:有点大是指超过 10 万行),这是非常糟糕的。您可以在批处理过程中更新它们,如果该列没有被索引,则只需几分钟,如果是,则不需要太多。如果您有超过 100,000 行产品,这意味着您的商店非常庞大,并且没有理由不使用上述解决方案来简化添加列。

最坏的情况,如果你的函数非常复杂并且你需要比 MySQL 提供的更强大的东西(这极不可能),你可以在 C 中创建一个函数并将其附加到 MySQL。这是我刚刚找到的教程。我还没有验证它,但它看起来很清晰和质量:http ://blog.loftdigital.com/blog/how-to-write-mysql-functions-in-c

于 2012-10-04T17:52:26.267 回答
0

假设您已经像这样编写了 sql:

$query = "SELECT * 
FROM `products` ;

这会返回一个名为的二维数组$result,类似于:

array (
"0" => array (
'price'=>100,
'shipping'=>10,
'acquisition'=>10,
 'fees'=>'10'
 ),
"1" => array (
'price'=>200,
'shipping'=>20,
'acquisition'=>20,
 'fees'=>'20'
 )
)

现在,由于您有一个现有的 php 函数来计算利润,您可以通过遍历数组来做到这一点:

$expectedResult = array();
foreach ($result as $row) {
    if (profit ($row ['price'] + $row ['shipping'] + $row ['acquisition'] +$row ['fees' ) > 10 ) 
        $expectedResult [] = $row ;
}

您将在此处仅在 $expectedResult 数组中获得所需的行。

注意:虽然这是一个解决方案,但它是一个糟糕的解决方案。好的解决方案可以是这样的:

  1. 在您的产品表中有一个利润列。
  2. 您可以编写一个 mysql 函数,因为无论如何您都必须计算它,您想在哪个轮胎中执行此操作实际上取决于您的资源在哪一侧更便宜。

这将在这里做你的伎俩而不会改变太多:)快乐编码:)

于 2012-10-04T18:12:19.770 回答
0

您需要获取值并在应用程序中处理它们。您不能将 PHP 函数传递给 MySQL。

如果可能,请使用任何可以执行等效操作的 SQL 命令。MySQL 支持许多可能做你想做的事情的函数。

通常这意味着您需要创建一个profit列,填充它,索引它,然后在查询中使用它:

SELECT * FROM products WHERE profit > 10

至于如何填充它,它可能很简单:

UPDATE products SET profit=(price - shipping - acquisition - fees)

目前尚不清楚您为什么首先将这些数字相加。

于 2012-10-04T17:52:24.347 回答
0

我创建了一个简单的 php 函数来使用 MySQL 查询。

任何查询都可以在 1 个简单的函数中执行。

在选择查询的情况下,我们可以获取选定的参数,因为变量名包含选定的参数值。

例如:

<?php

q("select user_name,email_id from users where user_id=48");



   echo $user_name;   echo "<br>";
   echo $email_id;
?>

或者你可以设置你自己的变量名,把“作为”

<?php

q("select user_name as uname, email_id as email from users where user_id=48");



   echo $uname;    echo "<br>";
   echo $email;
?>

结果输出将是:

  someuser
  someemail

如果选择了更多行数,则变量名称将创建 为 ex 的数组:

<?php

      q("select user_name,user_id from users");

      for($n=0;$n<count($user_name);$n++)
      {

            if(count($user_name)==1)  // if single row is selected
            {

                $username_val=$user_name;
                $user_ids=$user_id;


            }else{
                $username_val=$user_name[$n]; // for multiple rows selected

               $user_ids=$user_id[$n];
            }

             echo $username;

      }

?>

或者你可以设置你自己的变量名,把“作为”

<?php

      q("select user_name as un,user_id as uid from users");

      for($n=0;$n<count($user_name);$n++)
      {

            if(count($user_name)==1)  // if single row is selected
            {

                $username_val=$un;
                $user_ids=$uid;


            }else{
                $username_val=$un[$n]; // for multiple rows selected
                 $user_ids=$uid[$n];
            }

             echo $username_val; echo " "; 
             echo $user_ids; echo "<br>";

      }

?>

结果输出将是:(如果用户表有三行)

User1 4043
User2 4048
User3 4056

创建mysql连接文件ex:mysql_connect_file.php

<?php

$dbc=new mysqli('localhost', 'my_user', 'my_password', 'my_db');

?>

php函数如下

<?php

   require_once './mysql_connect_file.php';
function q($q)
       {

    $main_q=$q;
    $q=  strtolower($q);
      global $dbc;

              $temp=$q;
              $temp=str_replace(" ", "", $temp);
              $temp=  strtolower($temp);
         $temp=".$temp";
              if(strpos($temp, "update")==1 || strpos($temp, "insert")==1 || strpos($temp, "delete")==1 || strpos($temp, "alter")==1 || strpos($temp, "create")==1)
              {
                  $rd2=  mysqli_query($dbc,$main_q);
                  if($rd2)
                  {
                      return TRUE;
                  }
                  else{


     $mysql_err=  mysqli_error($dbc);

            $err=  debug_backtrace();
            $err_line=$err[0]['line'];
            $err_file=$err[0]['file'];
      echo  "<font color='black'>Error at <b>$err_file on line $err_line  </b>query --></font><font color='maroon'>$main_q</font> (<font color='red'> $mysql_err </font> )";

      return FALSE;

                  }

              }elseif(strpos($temp, "select")==1){


     $qn=  str_replace("select ", "", $q);

     $qn=substr($qn,0,  strpos($qn, " from"));
     $qn="$qn,";

       $selc=  str_replace("`","", $qn);
       $qn=  str_replace("`","", $qn);
       $my_var=array();

      $my_nm=array();
       for($m=1;$m<=substr_count($selc, ',');$m++)
       {
              $my_nm[$m]=substr($qn,0,  strpos($qn, ","));

              $qn=substr($qn,strpos($qn, ",")+1, strlen($qn));
              if(strpos($my_nm[$m]," as ")>0)
              {
      $my_var[$m]=  str_replace(" as ", "~", $my_nm[$m]);
      $my_var[$m]=  str_replace(" ", "", $my_var[$m]);


      $my_var[$m]=substr($my_var[$m],strpos($my_var[$m],"~")+1,strlen($my_var[$m]));
              }else
              {
  $my_var[$m]=substr($my_nm[$m],0,  strlen($my_nm[$m]));  
  $my_var[$m]=  str_replace(" ","", $my_var[$m]);
              }

       }

       $rn=mysqli_query($dbc, $main_q);

       if($rn)
      {

              if(mysqli_num_rows($rn)>0)
              {       

               for($t=1;$t<=count($my_var);$t++)
             {

          $$my_var[$t]=array();


             }


    while($row=mysqli_fetch_array($rn,MYSQLI_ASSOC))
    {

           if(mysqli_num_rows($rn)>1)
           {


              for($t=1;$t<=count($my_var);$t++)
             {

             ${$my_var[$t]}[]=$row[$my_var[$t]];
    }

     }else{

             for($t=1;$t<=count($my_var);$t++)
             {
    $$my_var[$t]=$row[$my_var[$t]];

             }


           }
    }

  if(mysqli_num_rows($rn)>1)
  {
     for($t=1;$t<=count($my_var);$t++)
             {
     $GLOBALS[$my_var[$t]]= sel_mr($my_var,$$my_var[$t]);


             }   


             for($t=1;$t<=count($my_var);$t++)
             {
     return $$my_var[$t];


             }
  }
  if(mysqli_num_rows($rn)==1)
  {

              for($t=1;$t<=count($my_var);$t++)
             {
     $GLOBALS[$my_var[$t]]=$$my_var[$t];

             }
             for($t=1;$t<=count($my_var);$t++)
             {
     return $$my_var[$t];

             }

  }



              }else
              {

       for($t=1;$t<=count($my_var);$t++)
             {
     $GLOBALS[$my_var[$t]]=NULL;

             }



             for($t=1;$t<=count($my_var);$t++)
             {
     return $my_var[$t];


             }

              }

      }else
      {

             for($t=1;$t<=count($my_var);$t++)
             {
     $my=  mysqli_error($dbc);
     if($t==1)
     {
            $err=  debug_backtrace();
            $err_line=$err[0]['line'];
            $err_file=$err[0]['file'];
      echo  "<font color='#ef0000'>Error at <b>$err_file on line $err_line  </b>query --></font><font color='maroon'>$q</font> (<font color='red'> $my </font> )";

     }


             }



             for($t=1;$t<=count($my_var);$t++)
             {
     for($p=0;$p<count($$my_var[$t]);$p++)
     {
            $a=$$my_var[$t];
            return $a;    
     }


             }

      }
              }


       }
     function sel_mr($a,$ab)
     {
            for($t=1;$t<=count($a);$t++)
            {
    foreach ($ab as $my)
    {

           ${$a[$t]}[]=$my;

    }
            }

            for($t=1;$t<=count($a);$t++)
            { 
    return $$a[$t];
            }


     } 

?>

备注:

您可以将此代码保存到文件中,然后您可以通过包含该文件名来调用此函数

例如:如果您的文件名是 q.php(--> 包含 q 函数),那么您可以通过包含将代码用于其他文件

<?php

include 'q.php';

  q("select user_name from users where user_id=4048");
   echo $user_name 
?>
于 2017-03-11T10:39:25.610 回答