Некоторые результаты в моей объединенной таблице равны NULL, почему это так? - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть запрос для поиска компаний.У каждой компании есть некоторые свойства, которые хранятся в другой таблице.

Значение, которое публикуется в моем запросе и с помощью которого люди ищут, называется tags.

Это мой запрос:

SELECT cnt.id as content_id, cnt.title as content_title, cnt.featured, cnt.ordering, cnt.alias as content_alias, cnt.catid, cnt.images, cnt.state, cnt.introtext,
MAX(case when f.field_id = 7 then f.value end) as hoofdafbeelding,
MAX(case when f.field_id = 8 then f.value end) as openingstijden,
MAX(case when f.field_id = 9 then f.value end) as straat,
MAX(case when f.field_id = 10 then f.value end) as facebook,
MAX(case when f.field_id = 11 then f.value end) as instagram,
MAX(case when f.field_id = 12 then f.value end) as telefoonnummer,
MAX(case when f.field_id = 13 then f.value end) as website,
MAX(case when f.field_id = 16 then f.value end) as tags
FROM snm_content cnt
LEFT JOIN snm_fields_values f
ON cnt.id = f.item_id
WHERE f.value LIKE '%vlees%'
GROUP BY cnt.id, cnt.title, cnt.featured, cnt.alias, cnt.catid, cnt.images, cnt.state, cnt.introtext
ORDER BY cnt.ordering

Моя проблема в том, что в моем результате все поля (строки с MAX) равны NULL, кроме тегов.Почему это так?

Приведенный выше запрос дает мне такой результат:

enter image description here

Все поля NULL хранятся точно так же, как и tags но tags показывает его значение, в то время как остальные равны NULL, почему?

Также все поля не являются именами столбцов, они являются псевдонимами, поскольку все они хранятся как value, который связан с field_id

Мне нужны все данные для поиска и только поиск(LIKE %%) в пределах tags.

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Ваши заявления о делах должны включать в себя предложения else.Также ваше левое внешнее объединение может возвращать нулевые записи .

SELECT cnt.id as content_id, cnt.title as content_title, ...
   MAX(case when f.field_id = 7 then f.value else isnull({Column Name}, {Column Name}) end) as hoofdafbeelding,
   MAX(case when f.field_id = 8 then f.value else isnull({Column Name}, {Column Name}) end) as openingstijden,
   MAX(case when f.field_id = 9 then f.value else isnull({Column Name}, {Column Name}) end) as straat,
   MAX(case when f.field_id = 10 then f.value else isnull({Column Name}, {Column Name}) end) as facebook,
   MAX(case when f.field_id = 11 then f.value else isnull({Column Name}, {Column Name}) end) as instagram,
   MAX(case when f.field_id = 12 then f.value else isnull({Column Name}, {Column Name}) end) as telefoonnummer,
   MAX(case when f.field_id = 13 then f.value else isnull({Column Name}, {Column Name}) end) as website,
   MAX(case when f.field_id = 16 then f.value else isnull({Column Name}, {Column Name}) end) as tags
0 голосов
/ 28 ноября 2018

Вы сказали, что только теги должны содержать значение 'vlees'.Таким образом, вы не должны помещать его в WHERE, потому что он фильтрует весь запрос, а не только теги.Я обновил ваш запрос, изменил место фильтра 'vlees'.Если другие поля (hoofdafbeelding, openingstijden ..) должны иметь другой фильтр, вы должны фильтровать их как теги, которые я обновил.И последнее, я думаю, что f.field_id =?фильтр тоже не правильный.С этим фильтром ваш результат CASE будет работать только для одного content.id, вероятно, вы должны удалить их.

SELECT
    cnt.id AS content_id
   ,cnt.title AS content_title
   ,cnt.featured
   ,cnt.ordering
   ,cnt.alias AS content_alias
   ,cnt.catid
   ,cnt.images
   ,cnt.state
   ,cnt.introtext
   ,MAX(CASE WHEN f.field_id = 7   THEN f.value END) AS hoofdafbeelding
   ,MAX(CASE WHEN f.field_id = 8   THEN f.value END) AS openingstijden
   ,MAX(CASE WHEN f.field_id = 9   THEN f.value END) AS straat
   ,MAX(CASE WHEN f.field_id = 10  THEN f.value END) AS facebook
   ,MAX(CASE WHEN f.field_id = 11  THEN f.value END) AS instagram
   ,MAX(CASE WHEN f.field_id = 12  THEN f.value END) AS telefoonnummer
   ,MAX(CASE WHEN f.field_id = 13  THEN f.value END) AS website
   ,MAX(CASE WHEN f.field_id = 16  THEN f.value END) AS tags
FROM snm_content cnt
LEFT JOIN snm_fields_values f ON cnt.id = f.item_id
WHERE EXISTS (SELECT 1 FROM snm_fields_values SFV WHERE cnt.id = SFV.item_id AND  SFV.value LIKE '%vlees%')
GROUP BY cnt.id
        ,cnt.title
        ,cnt.featured
        ,cnt.alias
        ,cnt.catid
        ,cnt.images
        ,cnt.state
        ,cnt.introtext
ORDER BY cnt.ordering
0 голосов
/ 28 ноября 2018

Вы фильтруете второй столбец в left join.Это подозрительно.Обычный совет - переместить это в предложение on:

FROM snm_content cnt LEFT JOIN
     snm_fields_values f
     ON cnt.id = f.item_id AND f.value LIKE '%vlees%'

С другой стороны, в этом случае, я думаю, вы, возможно, вообще не захотите этого условия в запросе.

Если вы действительно хотите искать по тегам, тогда вы можете использовать:

having tags like '%vlees%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...