1

我有一个包含这样数据的表:

articles. id   | author                | title     | content  | type
             1 | author1, author2      | thetitle1 | text1    | typeA
             2 | author1               | thetitle2 | text2    | typeB
             3 | author2               | thetitle3 | text3    | typeA

Posted 数组是一个过滤器:

$conditions = array();
$where = '';

if(isset($_POST['authors'])){ //empty, is_array and etc.
  $authors = $_POST['authors']; // [ author1, author2 ]
  $conditions[] = "author IN ('".implode("','",$authors)."')";
}
if(isset($_POST['types'])){
  $types = $_POST['types']; // [ typeA, typeB ]
  $conditions[] = "type IN ('".implode("','",$types)."')";
}

if(!empty($conditions)){
  $where = ' WHERE '.implode(' AND ', $conditions);
}

$sql = "SELECT * FROM articles".$where;

似乎一切正常,但该字段author可以包含几个作者,以逗号分隔,因此过滤器author IN ('author1')将不起作用。如何选择所有author1涉及的文章(在这种情况下是第一和第二条记录)?

4

4 回答 4

2

我认为您需要更改数据库结构。通过字符串搜索很慢(ish),这现在可能有效,但是当数据集增加时,这将成为一个拖累。

我认为这样的事情会更好:

author
--------
id  name  
1   author1
2   author2

books:
--------
id  title  
1   Some Book  
2   Some Other Book  

author_book:
--------
id  author_id  book_id
1     1         1
2     1         2
3     2         2

在我的例子中,作者 1 写了第 1 本书和第 2 本书,作者 2 写了第 2 本书 另一个在附近:第 1 本书由作者 1 撰写,第 2 本书由作者 1 和 2 撰写

从长远来看,它更加灵活。正确的数据库结构非常重要

于 2013-08-02T09:09:16.470 回答
1

我同意@Martijn,但如果你不能改变数据库,你可以尝试这样的事情:

if(isset($_POST['authors'])){ //empty, is_array and etc.
  $authors = $_POST['authors']; // [ author1, author2 ]
  $subC = array();
  $subC [] = " ( author IN ('".implode("','",$authors)."') ) ";
  foreach ($authors as $a){
      $subC [] = " ( author LIKE %$a% ) " ;
  }

  $subC = ' ( ' . implode (' OR ' , $subC) . ' ) ';

  $conditions[] = $subC;
}

它远非完美,但应该可以解决问题。

于 2013-08-02T09:09:45.000 回答
0

您需要规范化您的结构保存逗号分隔值不是您的问题的好习惯,您可以使用FIND_IN_SET

SELECT * FROM articles WHERE type IN (...) OR FIND_IN_SET("author1", author)

其他你也可以使用 LIKE 来匹配所需的结果,但这不是一个好主意

SELECT * FROM articles WHERE type IN (...) OR  author LIKE '%author1%';

这是参考在集合中查找

于 2013-08-02T09:14:25.620 回答
0

尝试这个。( http://codepad.org/wjISZj54 )

   <?php
 $authors = array('abc','def','asd'); 

$types=array('type1','type2');

$authorarr=array();
foreach($authors as $author)
{
 $authorarr[]="'".$author."'";
}

$authorstr=implode(',',$authorarr);

   $conditions[] = "author IN ($authorstr)";


$typearr=array();
foreach($types as $type)
{
 $typearr[]="'".$type."'";
}

$typestr=implode(',',$typearr);

   $conditions[] = "type IN ($typestr)";



if(!empty($conditions)){
  $where = ' WHERE '.implode(' AND ', $conditions);
}

echo $sql = "SELECT * FROM articles".$where;



?>
于 2013-08-02T09:07:22.333 回答