2015-08-08 3 views
2

У меня возникли некоторые проблемы с SQL Query ...SQL Inner Присоединяйтесь и

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", "SearchResult": "31", "область": "стокгольм"}, { "Поиск слова": "Бизнес", "searchid": "329", "SearchResult": "1", "область": "стокгольм"} , { "Поиск слова": "Больница", "searchid": "330", "SearchResult": "1", "область": "стокгольм"}, { "Поиск слова": "Транспорт", "searchid": "337 " "SearchResult": "4", "область": "стокгольм"}, { "Поиск слова": "Электронный", "searchid": "334", "SearchResult": "4", "область":" стокгольм "}, {" Поиск слова ":" Автомобили», "searchid": "338", "SearchResult": "3", "область": "стокгольм"}, { "Поиск слова": "Питание", "searchid": "340", "SearchResult": "11", "область": "стокгольм"}, { "Поиск слова": "розничный", "searchid": "342" , "SearchResult": "8", "область": "стокгольм"}, { "Поиск слова": "лизинг", "searchid": "343", "SearchResult": "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

"* Не работает *" не является допустимым сообщением об ошибке в любой СУБД. Что такое ошибка? И какую СУБД вы используете? Postgres? Oracle? –

+0

Включая записи, которые не соответствуют критерию 'JOIN', обычно выполняются с использованием' OUTER JOIN' вместо 'INNER JOIN'. Не могли бы вы предоставить структуру таблицы и образцы данных в [SQL Fiddle] (http://www.sqlfiddle.com/)? И ожидаемый результат? Какую версию системы баз данных вы используете? – Abecee

+0

a_horse, извините, не знаю, что такое СУБД, это в php, и я использую mysql. Извините, возможно, я должен был добавить этот вопрос на MySql. –

ответ

0

пустые "значения", или null s, в 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 (и предоставлять ссылку на обновленную версию).

Смежные вопросы