【问题标题】:Where condition permutation in SQLSQL中的where条件排列
【发布时间】:2023-03-07 16:38:02
【问题描述】:

我想选择那些只包含 '1' 和 '2' 和 '1,2' 和 '2,1' 的记录

【问题讨论】:

  • 试试这个:where image in ("1", "2", "1,2", "2,1")
  • 但是如果我想选择一个包含“1,2,3”的,那么我必须写出它们的排列。所以我想让它在所有情况下都是动态的。
  • 对于字段的未排序的逗号分隔值设计,按照 Veniamin 的建议对所有组合进行完全匹配确实是使用索引的唯一方法。我建议您规范化您的表格或在更新/插入时对您的数字进行排序,以便您获得 一个 完全匹配的搜索结果。
  • 不要将数据存储为逗号分隔值...只会给您带来很多麻烦。
  • 您使用的是哪个 DBMS? (我同意 Joachim 和 jarlh 的观点:不要将逗号分隔的值存储在单个列中)

标签: php sql permutation comma separator


【解决方案1】:

关于从jarlh创建新表的好答案

您可以使用列创建新表jobs_images

id - primary
id_job
id_image

并选择使用连接为例:

SELECT * FROM `jobs` LEFT JOIN `jobs_images` ON (`jobs_images`.`id_job`=`jobs`.`id`) 
WHERE `jobs_images`.`id_image` IN (1,2,3)

【讨论】:

    【解决方案2】:

    最后我用这段代码进行了查询。并且我决定将数据以 order 格式存储在 image 字段中。

      <?php
        echo "<pre>";
        $str = "1,2,3";
        function getCombinations($array) {
            //initalize array
            $results = [[]];
            //get all combinations
            foreach ($array as $k => $element) {
                foreach ($results as $combination)
                    $results[] =  $combination + [$k => $element];
            }
            //return filtered array
            return array_values(array_filter($results));
        }
        $arr = getCombinations(explode(",", $str));
        $lastElement = end($arr);
        foreach($arr as $v){
          $sep=",";
            if($lastElement == $v){
            $sep='';
            }
              $condition .= "'".implode(",", $v)."'".$sep;
        }
        echo $qry = "select * from job_detail where image in (".$condition.")";
    ?>
    

    【讨论】:

      猜你喜欢
      • 2011-08-31
      • 1970-01-01
      • 2023-01-02
      • 1970-01-01
      • 1970-01-01
      • 2017-12-19
      • 2010-09-26
      • 1970-01-01
      • 2016-04-12
      相关资源
      最近更新 更多