SELECT查询多次选择一行,如何只选择一次

时间:2013-10-19 12:52:48

标签: php mysql

我正在尝试根据标签搜索照片表。

我将搜索字词拆分为单独的关键字,并在表格中搜索每个关键字,将所有匹配项推送到数组。

$keywords = explode(' ', $keywords);
$photos = array();

// loop through each keyword
foreach($keywords as $keyword){

$row = $mysqli->query(" SELECT * FROM photos WHERE tags LIKE '%$keyword%' ");

// loop through each row result
    while( $query_result = $row->fetch_assoc() ){

        // push result to photos array
        array_push($photos, $query_result);

    }

}

然而,这可以多次返回相同的表格行,例如,如果我搜索“mod modded”,任何带有“modded”标签的照片都会在两个关键字匹配时被推到顶部数组两次。

如何确保只选择一行?

修改

感谢您的回复,但都没有奏效,我已经实现了我的目标:

$keywords = explode(' ', $keywords);
$photos = array();

// loop through each keyword
foreach($keywords as $keyword){

    $row = $mysqli->query(" SELECT * FROM photos WHERE tags LIKE '%$keyword%' ");

    // loop through each row result
    while( $query_result = $row->fetch_assoc() ){

        $dontPush = false;

        // check photos array to see if the query_result already exists
        foreach($photos as $photo){
            if($photo == $query_result){
                $dontPush = true;
            }
        }

        if($dontPush === false){
            // push result to photos array if it dodesnt already exist
            array_push($photos, $query_result);
        }

    }

}

但这会创建如此多的循环,如果我有一个大数据库,肯定需要很长时间才能返回结果?有没有更好的方法

3 个答案:

答案 0 :(得分:1)

尝试选择区别

SELECT DISTINCT * FROM photos WHERE tags LIKE '%$keyword%'

W3 Schools

或者,您也可以将LIMIT 1添加到末尾以仅返回第一行。

答案 1 :(得分:1)

试试这个

<?php 
$keywords = explode(' ', $keywords);
$photos = array();

$query = " SELECT * FROM photos ";

// loop through each keyword
foreach($keywords as $k => $keyword){

    if ($k==0) {
       $query .= " WHERE ";
    }

    $query .= " tags LIKE '%$keyword%' ";

    if ($k-1 < count($keywords)) {
       $query .= " OR ";
    }
}

$row = $mysqli->query( $query );
while( $query_result = $row->fetch_assoc() ){

    // push result to photos array
    array_push($photos, $query_result);

}
?>

答案 2 :(得分:0)

对于任何有兴趣的人,我设法解决这个问题,以确保不会返回重复项:

$keywords = explode(' ', $keywords);
$photos = array();
$query = " SELECT * FROM photos WHERE tags LIKE ";

// loop through each keyword
foreach($keywords as $i => $keyword){

    $query .= "'%$keyword%'";

    if($i+1 < count($keywords) ){
        $query .= " union SELECT * FROM photos WHERE tags LIKE ";
    }


}

$row = $mysqli->query( $query );

// loop through each row result
while( $query_result = $row->fetch_assoc() ){

    array_push($photos, $query_result);

}