簡體   English   中英

SQL 組內連接無法獲取所有結果

[英]SQL group inner join cannot get all results

我真的想讓這個 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
    )

 )

但是,它不會給我任何沒有搜索命中的其他結果,會返回類似 [searchresult] => 0 的結果。這意味着它們不會按我的意願分組,因為 company_data 表中沒有這樣的搜索詞。

我該如何解決這個問題,請幫忙:(

編輯:

這是完整的代碼:

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以便任何與連接條件中的搜索條件不匹配的行都將帶有空值,因此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的詳細信息聯接類型。

您需要一個LEFT JOIN ,而不是一個INNER JOIN 但是,您還可以進行其他簡化:

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

例如,當您不更改列名稱時,您不需要列別名。 您只在searchwordsearchword 我認為這在search_words是獨一無二的。 否則, s.ids.region s.date將具有不確定的值。

LIKE用於JOIN會影響性能。 如果您只有少量數據,這很好。 否則,您可能需要考慮其他數據結構。

我想你想要的也許是這樣的:

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM