пользовательский MySQL выбор оператора для WordPress - PullRequest
3 голосов
/ 16 февраля 2009

Я разработал таксономию для сайта, над которым я работаю, который может злоупотреблять системой категоризации WordPress. Посты классифицируются как по темам, на которые они ссылаются (скажем, кошки, собаки, обезьяны), а также что это за пост (скажем, эксперт, организация, статья). Поэтому я хотел бы найти все сообщения о кошках и собаках и организации. Что-то вроде IN (кошки, собаки) и IN (организации) ... по крайней мере, как это имеет смысл для меня, но я не могу понять правильный синтаксис SQL для этой задачи.

Исходя из того, что я нашел в этой статье на wordpress.com , я строю запрос ниже ... но я не уверен в правильном синтаксисе для того, чтобы сказать «я хочу» то, что принадлежит (категории 1 или 2) и (принадлежит категории 3) (скажем, кошка 1 = кошки, 2 = собаки, 3 = организации).

Это, наверное, очень просто, и я буду пинать себя, когда получу ответ.

SELECT * FROM $wpdb->posts
LEFT JOIN $wpdb->postmeta ON($wpdb->posts.ID = $wpdb->postmeta.post_id)
LEFT JOIN $wpdb->term_relationships ON($wpdb->posts.ID = $wpdb->term_relationships.object_id)
LEFT JOIN $wpdb->term_taxonomy ON($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
WHERE $wpdb->term_taxonomy.term_id = 1,2,3
AND $wpdb->term_taxonomy.taxonomy = 'category'
AND $wpdb->posts.post_status = 'publish'
ORDER BY $wpdb->postmeta.meta_value ASC

Спасибо!

1 Ответ

1 голос
/ 16 февраля 2009

Поскольку эти два условия существуют в разных строках таблицы term_taxonomy, вам необходимо дважды присоединиться к этой таблице, чтобы сравнить их в одной строке набора результатов.

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

Вы можете использовать псевдонимы таблиц, чтобы вам не приходилось повторять имена таблиц переменных.

Так что я не проверял это, но следующее должно быть ближе к тому, что вам нужно:

SELECT * FROM $wpdb->posts p
 INNER JOIN $wpdb->postmeta m ON (p.ID = m.post_id)
 INNER JOIN $wpdb->term_relationships r1 ON (p.ID = r1.object_id)
 INNER JOIN $wpdb->term_taxonomy x1
  ON (r1.term_taxonomy_id = x1.term_taxonomy_id)
 INNER JOIN $wpdb->term_relationships r2 ON (p.ID = r2.object_id)
 INNER JOIN $wpdb->term_taxonomy x2
  ON (r2.term_taxonomy_id = x2.term_taxonomy_id)
WHERE x1.term_id IN (1, 2) AND x1.taxonomy = 'category'
 AND x2.term_id = 3 AND x2.taxonomy = 'category'
 AND p.post_status = 'publish'
ORDER BY m.meta_value ASC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...