2012-07-02 2 views
0

я могу получить ссылки из базы данных WordPress, которые находятся в определенной категории, как это (я добавил разрывы строк в SQL части для ясности):SQL запросов для wp_links в нескольких категориях

$category1 = 'stuff'; 
$category2 = 'other_stuff'; 

$q = 'select * from wp_links l 
    inner join wp_term_relationships r on l.link_id = r.object_id 
    inner join wp_term_taxonomy using (term_taxonomy_id) 
    inner join wp_terms using (term_id) 
    where taxonomy = "link_category" 
    and name = '.$category1; 

$results = $wpdb->get_results($q); 

Как бы я получить ссылки, которые находятся в и$category1 и $category2 (я имею в виду категории, а не категории)?

+0

Будет ли это всегда '2' категории, или вам нужно обобщать это к категориям 'n'? Кроме того, к какой таблице принадлежит 'name'? Я предполагаю, что он находится в 'wp_terms'? – MatBailie

+0

@Dems Моя особая потребность в категориях «2», хотя я бы приветствовал ответ «n» для образовательных целей. Вы правы, что 'name' находится в' wp_terms' - извинения за упущение. – wwninja

ответ

0

на предположении, что name поле вы ищете на находится в таблице wp_terms, есть два основных варианта.

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

select * from wp_links   l 
inner join wp_term_relationships r on l.link_id   = r.object_id 
inner join wp_term_taxonomy  t on r.term_taxonomy_id = t.term_taxonomy_id 
inner join wp_terms    c1 on t.term_id   = c1.term_id 
inner join wp_terms    c2 on t.term_id   = c2.term_id 
where taxonomy = "link_category" 
and c1.name = 'stuff' 
and c2.name = 'other_stuff' 

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

select 
    l.* 
from 
(
    select l.id from wp_links  l 
    inner join wp_term_relationships r on l.link_id   = r.object_id 
    inner join wp_term_taxonomy  t on r.term_taxonomy_id = t.term_taxonomy_id 
    inner join wp_terms    c on t.term_id   = c.term_id 
    where taxonomy = "link_category" 
    and c.name IN ('stuff', 'other_stuff') 
    group by l.id 
    having count(distinct c.name) = 2 
) 
    subquery 
inner join wp_links l ON subquery.id = l.id 

внутренний запрос находит все, что имеют одну категорию или другой, но то предложение having позволяет только через те, у которых есть две категории в нашем списке. (Другими словами, оба из них.) [Он также предполагает, что таблица wp_links как id колонки использовать в качестве уникального идентификатора.]

+0

'wp_links', как представляется, использует' link_id' как уникальный идентификатор. Я протестировал ваше второе решение, заменив 'l.id' на' l.link_id' и, похоже, работает. Спасибо за то, что уделили лишнюю милю здесь - я воплощу свое второе решение, чтобы дать себе некоторую гибкость по дороге. – wwninja

0

Вы пытались использовать ИЛИ?

$q = 'select * from (select * from wp_links l 
     inner join wp_term_relationships r on l.link_id = r.object_id 
     inner join wp_term_taxonomy using (term_taxonomy_id) 
     inner join wp_terms using (term_id) 
     where taxonomy = "link_category" 
     and name = '.$category1.') as t1 join (select * from wp_links l 
     inner join wp_term_relationships r on l.link_id = r.object_id 
     inner join wp_term_taxonomy using (term_taxonomy_id) 
     inner join wp_terms using (term_id) 
     where taxonomy = "link_category" 
     and name = '.$category2 .') as t2 
     on t1.term_id=t2.term_id; 

Я не думаю, что это лучшее решение, но вы не даете мне более подробную информацию о вашей структуре таблицы, что у вас есть

+0

Если я ошибаюсь, это даст мне ссылки, которые находятся в $ category1, плюс ссылки, которые находятся в $ category2. Я хочу совпадение между двумя категориями. – wwninja

+0

Вы можете отобразить вывод своего запроса? – jcho360

+0

Предположим, что $ category1 = "things_that_are_red" и $ category2 = "things_that_are_round". Ваш запрос даст мне яблоко, пожарный грузовик, бейсбол. Я хочу только яблоко, потому что оно красное * и * круглое. – wwninja

Смежные вопросы