SQL WordPress Пользовательский запрос Внутреннее соединение - PullRequest
1 голос
/ 26 октября 2011

У меня возникли некоторые трудности с моим оператором SQL. Я делаю запрос на WordPress для отображения сообщений на основе нескольких мета-полей сообщений. Когда я выполняю запрос и выполняю фильтрацию только с одним мета-полем, или с ИЛИ для нескольких, это работает, однако И для нескольких неудач.

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 

Ответы [ 3 ]

2 голосов
/ 26 октября 2011

Ваш запрос проверяет, имеет ли 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 (и, конечно же, запятую на предыдущей строке) и первый JOIN к wp_postmeta, и запрос будет работать так же.

0 голосов
/ 26 октября 2011

Проблема в предложении where вашего внутреннего выбора;Я предполагаю, что wpostmeta возвращает несколько строк.Предыдущий комментарий, что строка не может быть двумя значениями, является правильным.Второй подход должен работать, если первый не

, сначала я подумал

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' AND 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
0 голосов
/ 26 октября 2011

В подзапросе похоже, что он ищет записи, в которых оба значения 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 на 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')
)
....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...