У меня есть таблица, которая выглядит примерно так, как показано ниже, и я делаю поисковый запрос с несколькими полями, чтобы уточнить поиск задания. На данный момент я могу войти в несколько полей, однако мои результаты поиска запрашивают всю базу данных, а не только для одного конкретного идентификатора.
Таблица:
contentId meta_key meta_value
1 1 vacancyType Hospitality
2 1 vacancyRole Chef
3 1 vacancyDate 2014-01-01
4 2 vacancyType Adin
5 2 vacancyArea St Albans
6 2 vacancyDate 2014-01-01
Код:
$getJobs1 = "SELECT distinct *
FROM cms_contentExtra, cms_content
WHERE cms_contentExtra.meta_value IN ('$type','$key')
AND cms_content.contentId = cms_contentExtra.contentId
GROUP BY cms_content.contentId";
$getJobs2 = mysql_query($getJobs1) or die("didn't query");
while ($getJobs3 = mysql_fetch_array($getJobs2)) {
echo ' - ' . $getJobs3[meta_value] . ' - ' . ' - ' . $getJobs3[contentId];
}
Это вернет:
- St Albans - - 8435 - St Albans - - 8436 - Hospitality & Catering - - 8437 - St Albans - - 8440 - Hospitality & Catering - - 8444 - Hospitality & Catering - - 8450 - Hospitality & Catering - - 8451 - St Albans - - 8453
Тем не менее, я хочу показать результаты, которые имеют ОБОИХ область и тип, и игнорировать другие. На данный момент он, кажется, отображает тип, а затем отображает область отдельно, поэтому я не могу показать тип в определенной области.
Я использую две таблицы для сравнения contentId с большим количеством данных, хранящихся в другой таблице.
Давайте более подробно рассмотрим ваш запрос. Вы group by contentId. Таким образом, вы получаете по одной записи за контент. Но вы выбираете *. (Это должен быть MySQL, потому что я не знаю никаких других dbms, допускающих это.) Таким образом, вы получаете запись контента, принадлежащую идентификатору контента, и одну (случайную) запись cms_contentExtra, принадлежащую идентификатору содержимого. Затем вы используете DISTINCT, поэтому вы получаете только отдельные строки. Но строки должны быть разными, потому что они отличаются по крайней мере в идентификаторе содержимого. Сказав это, ваш запрос не имеет смысла, и я рекомендую вам искать GROUP BY и DISTINCT в книге или учебнике. (Кроме того, вы не должны использовать синтаксис соединения, разделенный запятой, который был заменен более двадцати лет назад явным соединением. Вместо этого используйте INNER JOIN.) До сих пор этому :-)
Чтобы очистить вас, я провожу вас шаг за шагом. Возможно, это не совсем то, что вы ищете, но я думаю, что это поможет вам составить окончательный запрос.
Чтобы получить идентификаторы контента с типом вакансии $ type:
select contentid
from cms_content
where meta_key = 'vacancyType' and meta_value = @type;
Чтобы получить идентификаторы контента с ключом местоположения $:
select contentid
from cms_content
where meta_key = 'vacancyArea' and meta_value = @key;
Чтобы получить идентификаторы контента, соответствующие типу $ type или $:
select distinct contentid
from cms_content
where (meta_key = 'vacancyType' and meta_value = @type)
or (meta_key = 'vacancyArea' and meta_value = @key);
Чтобы получить идентификаторы контента, соответствующие типу $ type и $:
select contentid
from cms_content
where (meta_key = 'vacancyType' and meta_value = @type)
or (meta_key = 'vacancyArea' and meta_value = @key)
group by contentid
having count(*) = 2;
Оператор IN
который вы используете, является операцией OR
.
Попробуйте использовать LIKE
например:
WHERE cms_contentExtra.meta_value LIKE "%$type%$key%"
OR cms_contentExtra.meta_value LIKE "%$key%$type%"
$getJob1 = "SELECT distinct * FROM cms_contentExtra, cms_content WHERE cms_content.contentId = cms_contentExtra.contentId AND (cms_contentExtra.meta_value LIKE '%$type%$key%' OR cms_contentExtra.meta_value LIKE '%$key%$type%') GROUP BY cms_content.contentId";