2014-02-13 3 views
1

Я использую этот sql для возврата результатов, основанных на внутреннем соединении с 3 метазначениями. Кажется, что он работает только с 1 AND(), когда я добавляю два других, он возвращает 0 результатов.Не удается запросить несколько значений в Inner Join

SELECT * FROM wp_posts 
INNER JOIN wp_postmeta 
ON (wp_posts.ID = wp_postmeta.post_id) 
WHERE wp_posts.post_type = 'plot' 
AND wp_posts.post_status = 'publish' 
AND (wp_postmeta.meta_key = 'plot_type' AND wp_postmeta.meta_value = 'Cottage') 
AND (wp_postmeta.meta_key = 'number_of_bedrooms' AND wp_postmeta.meta_value = '2') 
AND (wp_postmeta.meta_key = 'property' AND wp_postmeta.meta_value = '446') 
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_title ASC; 

ответ

0

Я думаю, вы хотели использовать OR с другим 2 (см. Ниже). Одно и то же поле не может быть двух разных вещей, поэтому вы получаете 0 результатов.

SELECT * 
    FROM wp_posts 
INNER JOIN wp_postmeta 
    ON (wp_posts.ID = wp_postmeta.post_id) 
WHERE wp_posts.post_type = 'plot' 
    AND wp_posts.post_status = 'publish' 
    AND ((wp_postmeta.meta_key = 'plot_type' AND 
     wp_postmeta.meta_value = 'Cottage') OR 
     (wp_postmeta.meta_key = 'number_of_bedrooms' AND 
     wp_postmeta.meta_value = '2') OR (wp_postmeta.meta_key = 'property' AND 
     wp_postmeta.meta_value = '446')) 
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_title ASC; 

редактировать, попробуйте ниже вместо этого:

select * from wp_posts 
join wp_postmeta on wp_posts.ID = wp_postmeta.post_id 
where wp_posts.post_type = 'plot' 
    and wp_posts.post_status = 'publish' 
    and concat(wp_postmeta.meta_key,'|',wp_postmeta.meta_value) 
     in ('plot_type|Cottage', 
      'number_of_bedrooms|2', 
      'property|446'); 
+0

Спасибо за быстрый ответ :) Я пробовал этот код, но, к сожалению, он не фильтрует сообщения, специфичные для всех этих критериев:/ –

+0

Попробуйте второй запрос, который я только что редактировал. Кстати, какова цель вашей группы по статье? Вы не используете какие-либо агрегированные функции. –

0

Вы должны присоединиться к таблице wp_postmeta один раз для каждого типа значения вам нужно.

SELECT whatever, whatever 
    FROM wp_posts AS p 

    JOIN wp_postmeta AS plottype 
    ON (p.ID = plottype.post_id AND plottype.meta_key = 'plot_type') 

    JOIN wp_postmeta AS bedrooms 
    ON (p.ID = bedrooms.post_id AND bedrooms.meta_key = 'number_of_bedrooms') 

    JOIN wp_postmeta AS property 
    ON (p.ID = property.post_id AND property.meta_key = 'property') 

WHERE wp_posts.post_type = 'plot' 
    AND wp_posts.post_status = 'publish' 

    AND plottype.meta_value = 'Cottage' 
    AND bedrooms.meta_value = '2' 
    AND property.meta_value = '466' 

GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_title ASC; 

Это wp_postmeta хранения ключей/значение немного сложнее, чтобы присоединиться к; ваши критерии присоединения должны вытащить соответствующий ключ, а также соответствующий идентификатор сообщения.

Хорошо известно, что SELECT * - плохая идея в программном обеспечении. Это особенно плохо, когда вы присоединяетесь к таким большим количествам таблиц. Перечислите нужные столбцы в наборе результатов.

Обратите внимание, что вы используете INNER JOIN, с которым JOIN является синонимом. Если какое-либо из значений, которые вы вытаскиваете из метаданных, отсутствует, так будет строка из вашего результирующего набора. Вы можете или не можете лучше использовать LEFT JOINs (вы не объяснили цель запроса.)

+0

Привет, Ollie, у меня есть фильтр поиска, The Plot имеет свойства типа = коттеджные спальни = 2, и это отношение к другому типу сообщения, который является «Имуществом», используя идентификатор свойства. Я попытался использовать запрос WP Query с мета-запросом, но он не возвращал правильные результаты, поэтому я выбрал поиск напрямую через SQL –

+0

. Я понимаю. Вы можете реализовать свой фильтр так, как я показал, например, произнеся «AND plottype.meta_value IN (« Коттедж »,« Каюта ») и спальни.meta_value BETWEEN 2 AND 3', например. –

0

Кажется, что некоторые структуры для ваших условий должны быть изменены.

Попробуйте следующее:

SELECT * FROM wp_posts 
INNER JOIN wp_postmeta 
ON (wp_posts.ID = wp_postmeta.post_id) 
WHERE wp_posts.post_type = 'plot' 
AND wp_posts.post_status = 'publish' 
AND (
     (wp_postmeta.meta_key = 'plot_type' AND wp_postmeta.meta_value = 'Cottage') 
     OR 
     (wp_postmeta.meta_key = 'number_of_bedrooms' AND wp_postmeta.meta_value = '2') 
     OR 
     (wp_postmeta.meta_key = 'property' AND wp_postmeta.meta_value = '446') 
    ) 
ORDER BY wp_posts.post_title ASC; 
0

мне удалось решить проблему с помощью WP_Meta_Query, то SQL он произвел был ...

SELECT wp_posts.* FROM wp_posts 
INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) 
INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id) 
INNER JOIN wp_postmeta AS mt2 ON (wp_posts.ID = mt2.post_id) 

WHERE 1=1 

AND wp_posts.post_type = 'plot' 
AND (wp_posts.post_status = 'publish') 
AND ( 
(wp_postmeta.meta_key = 'property' AND CAST(wp_postmeta.meta_value AS CHAR) = '180') 
    AND (mt1.meta_key = 'plot_type' AND CAST(mt1.meta_value AS CHAR) = 'Cottage') 
    AND (mt2.meta_key = 'number_of_bedrooms' AND CAST(mt2.meta_value AS CHAR) = '2') 
) 
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_title ASC; 

Спасибо всем за помощь :)