2015-08-08 75 views
2

我遇到一些麻煩與SQL查詢...SQL內部連接和

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.text LIKE CONCAT( '%', s.searchword, '%') 

    AND c.region = s.region 

    GROUP BY 1 ORDER BY s.date DESC 

結果

[{ 「搜索內容」: 「批發」, 「searchid」: 「416」, 「信息搜索結果」: 「31」, 「區域」: 「斯德哥爾摩」},{ 「搜索內容」: 「商業」, 「searchid」: 「329」, 「信息搜索結果」: 「1」, 「區域」: 「斯德哥爾摩」} ,{ 「搜索內容」: 「醫院」, 「searchid」: 「330」, 「信息搜索結果」: 「1」, 「區域」: 「斯德哥爾摩」},{ 「搜索內容」: 「交通」, 「searchid」:「337 「 」信息搜索結果「: 」4「, 」區域「: 」斯德哥爾摩「},{ 」搜索內容「: 」電子「, 」searchid「: 」334「, 」信息搜索結果「: 」4「, 」區域「:」 斯德哥爾摩「},{」 搜索內容 「:」 汽車」, 「searchid」: 「338」, 「信息搜索結果」: 「3」, 「區域」: 「斯德哥爾摩」}, { 「搜索內容」: 「食品」, 「searchid」: 「340」, 「信息搜索結果」: 「11」, 「區域」: 「斯德哥爾摩」},{ 「搜索內容」: 「零售」, 「searchid」: 「342」 , 「信息搜索結果」: 「8」, 「區域」: 「斯德哥爾摩」},{ 「搜索內容」: 「租賃」, 「searchid」: 「343」, 「信息搜索結果」: 「1」, 「區域」: 「斯德哥爾摩」 }]

這裏的問題是...區域列對所有區域都有一個空值。 我也需要收集這些......如你所見,它只收集斯德哥爾摩。

所以我想這樣...

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.text LIKE CONCAT( '%', s.searchword, '%') 

    AND c.region = s.region OR s.region = '' 

    GROUP BY 1 ORDER BY s.date DESC 

但它不工作:(

+1

「*不起作用*」在任何DBMS中都不是有效的錯誤消息。究竟是什麼錯誤?你使用哪個DBMS? Postgres的?甲骨文? –

+0

包含不符合'JOIN'標準的記錄通常使用'OUTER JOIN's而不是'INNER JOIN'來完成。你能否提供表格結構,以及[SQL小提琴](http://www.sqlfiddle.com/)中的示例數據?預期的產出?您使用哪種數據庫系統的版本? – Abecee

+0

a_horse,抱歉,不知道DBMS是什麼,這是在PHP和我使用MySQL。 對不起,也許我應該把這個問題添加到MySql。 –

回答

0

空「值」,​​或null秒,在SQL不是真正的價值 - 他們是其不足,並需要由is運營商明確處理。此外,and具有更高的優先級比or,所以你應該都處理括號中的region條件:

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.text LIKE CONCAT( '%', s.searchword, '%') AND 
      (c.region = s.region OR s.region IS NULL) 
GROUP BY 1 ORDER BY s.date DESC 
0

如果區域可以是NULL''(空值),這是檢查防彈方式:

COALESCE(s.region, '') = '' 

這樣你比較空字符串之前''更換NULL

0

基於到目前爲止所提供的信息,你可能會想嘗試沿着

SELECT 
    s.searchword AS searchword, 
    s.id AS id, 
    COUNT(c.id) AS searchresult, 
    IFNULL(s.region, 'all') AS region 
    FROM search_words AS s 
    INNER JOIN company_data AS c 
     ON IFNULL(s.region, 'all') = IFNULL(c.region, 'all') 
     AND c.text LIKE CONCAT( '%', s.searchword, '%') 
    GROUP BY 1, 2, 4 
    ORDER BY s.date DESC 
; 

看到它在行動:SQL Fiddle

請發表評論,如果和這需要調整/進一步的細節。特別是,可以隨意調整SQL Fiddle(並提供指向更新版本的鏈接)。