Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL组内部联接无法获得所有结果_Php_Sql - Fatal编程技术网

Php SQL组内部联接无法获得所有结果

Php SQL组内部联接无法获得所有结果,php,sql,Php,Sql,我真的很想让这个SQL正常工作。我不是专家,所以我真的搞不懂 $sqlquery = " SELECT s.searchword AS searchword, s.id AS id, COUNT( c.id ) AS searchresult, s.region AS region FROM search_words AS s INNER JOIN company_data AS c ON c.branch_text LIKE

我真的很想让这个SQL正常工作。我不是专家,所以我真的搞不懂

$sqlquery = " SELECT 
    s.searchword AS searchword, 
    s.id AS id, 
    COUNT( c.id ) AS searchresult, 
    s.region AS region 
    FROM search_words AS s 
    INNER JOIN company_data AS c ON 
    c.branch_text LIKE CONCAT(  '%', s.searchword,  '%' )       
    GROUP BY 1 ORDER BY s.date DESC";
这给了我:

Array
    (
[0] => Array
    (
        [searchword] => WHOLESALE
        [searchid] => 427
        [searchresult] => 98
        [region] => stockholm
    )

[1] => Array
    (
        [searchword] => cars
        [searchid] => 426
        [searchresult] => 26
        [region] => 
    )

[2] => Array
    (
        [searchword] => Retail
        [searchid] => 342
        [searchresult] => 41
        [region] => stockholm
    )

[3] => Array
    (
        [searchword] => Springs
        [searchid] => 339
        [searchresult] => 4
        [region] => stockholm
    )

[4] => Array
    (
        [searchword] => Leasing
        [searchid] => 343
        [searchresult] => 2
        [region] => stockholm
    )

[5] => Array
    (
        [searchword] => Food
        [searchid] => 340
        [searchresult] => 37
        [region] => stockholm
    )

 )
但是,它没有给我任何其他没有searchhits的结果,会返回类似[searchresult]=>0的结果。这意味着它们没有按照我的意愿进行分组,因为company_数据表中没有此类搜索词

如何修复此问题,请帮助:(

编辑:

以下是完整的代码:

public function getUserSearches()
    {

    $sqlquery = " SELECT 
    s.searchword AS searchword, 
    s.id AS id, 
    s.userId AS userid, 
    COUNT( c.id ) AS searchresult, 
    s.region AS region 
    FROM search_words AS s 
    INNER JOIN company_data AS c ON 
    c.branch_text LIKE CONCAT(  '%', s.searchword,  '%' )       
    GROUP BY 1 ORDER BY s.date DESC";

     // IS THERE ANYTHING WRONG HERE?? LIKE IT DOES NOT MATCH AGAINST THE USER?
    $result = $this->dbh->query($sqlquery, array(":userId" => $this->user_id));

    $arr = array();
    foreach ($result as $item)  {
        array_push($arr, array('searchword' => $item['searchword'], 'searchid' => $item['id'], 
    'searchresult' => $item['searchresult'], 'userid' => $item['userid'],
    'region' => $item['region']));
    }

    return json_encode($arr);
    return print_r($arr);
}

使用
LEFT JOIN
,这样任何与连接条件中的搜索条件不匹配的行都将为null,因此
count
将为0。类似于以下内容:

SELECT 
  s.searchword AS searchword, 
  s.id AS id, 
  s.region AS region,
  COUNT(COALESCE(c.id, 0)) AS searchresult
FROM search_words AS s 
LEFT JOIN company_data AS c 
        ON c.branch_text LIKE CONCAT(  '%', s.searchword,  '%' )       
GROUP BY s.searchword, s.id, s.region
ORDER BY s.date DESC;

有关SQL联接类型的更多详细信息,请参阅。

您需要一个
左联接
,而不是
内部联接
。但是,您也可以进行其他简化:

SELECT s.searchword, s.id, COUNT( c.id ) AS searchresult, s.region 
FROM search_words s INNER JOIN
     company_data c
     ON c.branch_text LIKE CONCAT('%', s.searchword, '%')       
GROUP BY 1
ORDER BY s.date DESC
例如,在不更改列名的情况下,不需要列别名。您仅在
searchword
上进行聚合;我假设这在
searchwords
中是唯一的。否则,
s.id
s.region
s.date
将具有不确定的值


连接使用
LIKE
会影响性能。如果您只有少量数据,这很好。否则,您可能需要考虑其他数据结构。

我认为您需要的可能是:

public function getUserSearches()
{

$sqlquery = " SELECT 
s.searchword AS searchword, 
s.id AS id, 
s.userId AS userid, 
COUNT( c.id ) AS searchresult, 
s.region AS region 
FROM search_words AS s
WHERE s.userId='"+$this->userid+"'  
LEFT JOIN company_data AS c ON 
c.branch_text LIKE CONCAT(  '%', s.searchword,  '%' )       
GROUP BY 1 ORDER BY s.date DESC";

 // IS THERE ANYTHING WRONG HERE?? LIKE IT DOES NOT MATCH AGAINST THE USER?
$result = $this->dbh->query($sqlquery);

$arr = array();
foreach ($result as $item)  {
    array_push($arr, array('searchword' => $item['searchword'], 'searchid' => $item['id'], 
'searchresult' => $item['searchresult'], 'userid' => $item['userid'],
'region' => $item['region']));
}

    return json_encode($arr);
return print_r($arr);
}

你可以用左外连接代替内连接。告诉我这是否解决了你的问题。几乎:)它给了我更多的结果几乎所有的结果都是32分36秒,奇怪。而且它也没有检查用户id。这就是我获得结果的方式,添加用户id:$result=$This->dbh->query($sqlquery,array(“:userId”=>$This->userId));也许完全错了。对不起,我没有正确理解你的评论。如果你仍然面临一些问题,你能发布你的php代码吗?是的,现在看看。谢谢我不确定为什么要添加
数组(“:userId”=>$this->user\u id)
,因为需要的参数是数据库链接。如果希望与userid匹配,那么可以修改查询以包含userid的where子句,并在替换userid之后添加一个参数。在
查询
函数调用中,它没有任何意义。谢谢,但这一个不起作用。我得到了所有的结果,但我确实得到了[searchresult]=>0。@AdrianMcCool-你能从两个表
search\u words
company\u data
中发布一些示例记录来知道问题出在哪里吗?我编辑了上面的帖子,包括整个函数,也许更简单。@AdrianMcCool Thaks,但是我需要一些样本记录来运行查询,看看它为什么不起作用,每个表中只有3或4条记录作为样本。好吧,我不能给你company_数据表,它太多了。它只是检查branch_文本列是否匹配。search_words表只包含id、userId、searchword、date和region