#mysql #sql #wordpress
#mysql #sql #wordpress
Вопрос:
У меня возникли некоторые трудности с моим SQL-оператором. Я делаю запрос на WordPress для отображения сообщений на основе нескольких метаполей post. Когда я выполняю запрос и фильтрую только с одним мета-полем, или ИЛИ на нескольких, это работает, однако И при нескольких сбоях.
SELECT wposts . *
FROM wp_posts wposts
INNER JOIN (
SELECT post_id
FROM wp_postmeta wpostmeta
WHERE (
(wpostmeta.meta_key = 'ulnooweg_business_industry'
AND wpostmeta.meta_value = 'Legal Services')
AND (
wpostmeta.meta_key = 'ulnooweg_business_province'
AND wpostmeta.meta_value = 'New Brunswick')
)
GROUP BY post_id
)
AS t ON t.post_id = wposts.ID
WHERE wposts.post_status = 'publish'
AND wposts.post_type = 'business'
ORDER BY wposts.post_title ASC
LIMIT 0 , 30
Комментарии:
1. ИЛИ и и логически различны. каких результатов вы ожидаете?
2. Да, я в курсе этого. Я хочу И, я хочу отфильтровать оба мета-значения. Я могу подтвердить, что данные существуют, однако мое заявление не возвращает это.
3. В чем ваш вопрос? Как должен выглядеть ваш запрос? Опубликуйте то, что вы пробовали, даже если это не сработает.
4. OP пытается выяснить, как он может получить набор сообщений, которые имеют как отраслевой мета-ключ «Юридические услуги», так И мета_ключ провинции «Нью-Брансуик».
Ответ №1:
Ваш запрос проверяет, являются ли meta_key (и meta_value) 2 разными значениями в одной строке, что невозможно. Но я вижу, что вы пытаетесь сделать..
Попробуйте присоединиться к таблице wp_postmeta дважды, кроме каждого с предложением ON, которое исключает все строки, кроме тех, которые удовлетворяют условию meta_key:
SELECT
p.*,
GROUP_CONCAT(CONCAT(pm.meta_key,':',pm.meta_value) SEPARATOR ',') AS meta_values
FROM
wp_posts p
JOIN wp_postmeta pm ON pm.post_id = p.ID
JOIN wp_postmeta pm_bi ON (pm_bi.post_id = p.ID AND pm_bi.meta_key = 'ulnooweg_business_industry')
JOIN wp_postmeta pm_bp ON (pm_bp.post_id = p.ID AND pm_bp.meta_key = 'ulnooweg_business_province')
WHERE
pm_bi.meta_value = 'Legal Services'
AND pm_bp.meta_value = 'New Brunswick'
AND p.post_type = 'business'
AND p.post_status = 'publish'
GROUP BY p.ID
ORDER BY p.post_title ASC
Примечание: я присоединился к таблице wp_postmeta 3 раза здесь, чтобы помочь доказать, что условия выполнены, но вы можете удалить строку GROUP_CONCAT (и, конечно, запятую в предыдущей строке) и первое соединение с wp_postmeta, и запрос будет работать так же.
Ответ №2:
Похоже, что в подзапросе он ищет записи, в которых оба wpostmeta.meta_key = 'ulnooweg_business_industry'
и wpostmeta.meta_key = 'ulnooweg_business_province'
— другими словами, wpostmeta.meta_key
должны быть равны двум строкам одновременно, чтобы удовлетворить этому условию. Кроме того, он ищет wpostmeta.meta_value = 'Legal Services'
и wpostmeta.meta_value = 'New Brunswick'
.
Я предполагаю, что это то, что вы хотите в WHERE
предложении подзапроса — измените один из AND
s на OR
:
....
WHERE (
(wpostmeta.meta_key = 'ulnooweg_business_industry'
AND wpostmeta.meta_value = 'Legal Services')
OR ( -- changed to an OR
wpostmeta.meta_key = 'ulnooweg_business_province'
AND wpostmeta.meta_value = 'New Brunswick')
)
....
Комментарии:
1. 1 хороший улов. Ответить на вопрос достаточно сложно, найти вопрос самостоятельно еще сложнее.
2. OP явно заявил, что он уже обнаружил, что он работает с OR, но он пытается выяснить, как он может получить набор сообщений, которые имеют как отраслевой мета-ключ «Юридические услуги», так И мета_ключ провинции «Нью-Брансуик».
3. @ghbarratt — на самом деле, неясно, чего хочет OP. В нем говорится, что он что
OR
-то сделал, и что это сработало… но что это было? Однако опубликованный код явно НЕ ДОЛЖЕН возвращать никаких результатов по причине, которую я упомянул.
Ответ №3:
Проблема заключается в предложении where вашего внутреннего выбора; Я предполагаю, что wpostmeta возвращает НЕСКОЛЬКО строк. Предыдущий комментарий о том, что строка не может иметь два значения, верен. 2-й подход должен работать, если 1-й не работает
сначала я подумал
WHERE
((wpostmeta.meta_key = 'ulnooweg_business_industry' AND wpostmeta.meta_value = 'Legal Services') OR
(wpostmeta.meta_key = 'ulnooweg_business_province' AND wpostmeta.meta_value = 'New Brunswick'))
Group by Post_ID
HAVING count(post_ID) = 2
Это будет работать, ТОЛЬКО если в wpostmeta есть только одна запись для каждого типа записи. Если
postmeta.meta_key = ‘ulnooweg_business_industry’ И wpostmeta.meta_value = ‘Юридические услуги’ могут встречаться дважды, то вышеуказанное не работает.
2-й подход
Select wposts.*
FROM WP_Posts wposts
INNER JOIN (
Select POST_ID from WP_POSTMeta where meta_key = 'ulnooweg_business_industry' AND wpostmeta.meta_value = 'Legal Services'
INTERSECT
SELECT POST_ID FROM WP_POST_META WHERE meta_key = 'ulnooweg_business_province' AND wpostmeta.meta_value = 'New Brunswick'
)
AS T on T.Post_ID = wposts.ID