【问题标题】:How to search through multiple set of dataset for columns and values in mysql query如何在多组数据集中搜索mysql查询中的列和值
【发布时间】:2015-12-21 23:16:36
【问题描述】:

杰森数据: avail":["Sun-2","Mon-2","Sun-3"]

$avail = $data['avail'];

//下面我按早上、下午和晚上对值进行分类。

if($avail != ""){
        foreach($avail as $k=>$v)
        {
             $v;
           //dividing value before and after the symbol '-'
            $array = explode('-', $v);
            $day =$array[0]; // Wed
            $column =  $array[1]; // 2

            if($column == 1)
            {
            $col = "morning";

            }
            if($column == 2)
            {
                $col = "afternoon";
            }
            if($column == 3)
            {
                $col = "evening";
            }
            array_push($cols,$col);
            array_push($days,$day);
        }

var_dump($cols) 的结果;

array (size=3)
  0 => string 'afternoon' (length=9)
  1 => string 'afternoon' (length=9)
  2 => string 'evening' (length=7)

var_dump($days) 的结果;

array (size=3)
  0 => string 'Sun' (length=3)
  1 => string 'Mon' (length=3)
  2 => string 'Sun' (length=3)

现在我像这样查询数据库中的表: //查询的一部分

$add_here .= sprintf(" AND %s",implode(' OR ', array_map(function($colx) use ($days) {return sprintf("posts.%s IN ('%s')", $colx, implode("','",$days));}, is_array($cols) ? $cols : array($cols))));

但直到现在,我才意识到我做错了,因为我对数据进行分类的方式构成了两个数组。一个用于当天的会话,另一个是每个会话的数据集。

$days = ['sun','mon','tue']; <- data for morning,afternoon and evening mixed together
$col = ['afternoon','morning','evening'];

在浏览器中:

AND (posts.afternoon IN ('sun','mon','tue') OR posts.morning IN ('sun','mon','tue') OR posts.night IN ('sun','mon','tue'))

看到它检查了$days 的所有数据与$cols 的每个值。但我想要的是,上午的数据与表中的上午列进行核对,而下午的数据与表中的下午列进行核对。晚上也一样。

如何更改我的代码以使 JSON 数据集的查询如下所示?

杰森数据: avail":["Sun-2","Mon-2","Sun-3"]

AND (posts.afternoon IN ('sun','mon') OR posts.night IN ('sun'))

上午、下午和晚上的值以逗号分隔 数据库中的值。上午、下午和晚上是名为 posts 的表中的列名

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    首先按数组中的列对日期进行分组。

    /* $periods[$column] = [$day1, ...] */
    $periods = [];
    foreach($avail as $v){
        list($day, $column) = explode("-", $v); // make sure you validated the data to avoid errors
        $periods[$column][] = "'" . mysqli_escape_string(strtolower($day)) . "'"; // PHP would automatically create an empty array if $periods[$column] was not defined
    }
    $intToCol = [1 => "morning", 2 => "afternoon", 3 => "night"];
    
    // $periods should now be identical to ["2" => ["'sun'", "'mon'"], "3" => ["'sun'"]]
    
    $conditions = [];
    foreach($periods as $int => $days){
        $dayString = implode(",", $days);
        $conditions[] = "posts." . $intToCol[$int] . " IN ($dayString)";
    }
    return "AND (" . implode(" OR ", $conditions) . ")";
    

    【讨论】:

    • 谢谢你好像得到了我想要的。但是我不确定如何在我的查询中应用数组。还有什么返回 "AND (" . implode(" OR ", $conditions) . ")";做什么?
    • var_dump($periods);返回空字符串和错误:警告:mysqli_escape_string() 需要 2 个参数,1 个在
    • 我看到您使用 MySQL 进行查询。我不确定您在那里使用的是哪个 MySQL 包装器,只是放置该函数来提醒您防止 SQL 注入。如果您认为没有必要,只需删除该函数调用即可。
    【解决方案2】:

    让您以您想要的结果为指导:阅读查询,您需要一组 OR'ed day-part 条件,每个条件都说明工作日列表。

    所以你可以这样工作(经过测试,工作正常):

    $avail = ["Sun-2","Mon-2","Sun-3"];
    
    $day_parts = [
      'morning',
      'afternoon',
      'evening',
    ];
    $decoded = [];
    if ($avail) {
      foreach ($avail as $v) {
        //dividing value before and after the symbol '-'
        $array = explode('-', $v);
        // register week_day as a key rather than a value, avoiding duplicates:
        $decoded[$day_parts[$array[1] - 1]]['"' . $array[0] . '"'] = TRUE;
      }
    }
    
    $ors = [];
    foreach ($decoded as $day_part => $week_days) {
      if ($week_days) {
        $ors[] = 'posts.' . $day_part . ' IN (' . implode(',', array_keys($week_days)) . ')';
      }
    }
    if ($ors) {
      $where_part = ' AND (' . implode(' OR ', $ors) . ')';
    }
    

    【讨论】:

      猜你喜欢
      • 2017-04-15
      • 2012-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多