Помогите плиз с запросом к БД

Главные вкладки

Аватар пользователя tolykot tolykot 5 января 2013 в 15:53

Помогите плиз с запросом к БД. Есть массив с tid (2,118) создается динамично. Нужно получить сумму нод c данными терминами.

Пытался получить желаемое из таблички term_node

SELECT COUNT(nid)
FROM term_node
WHERE tid IN (2,118)

Получаю сумму нод с терминами без связки:
Рамки - 5000&&Школьные 100=5100
А нужно:
Рамки - 5000&&Школьные 100=60

Мой запрос не правильный, так еще и без проверки на статус нод-это пока не главное, допилю...

Помоги пожалуйста Smile

Комментарии

Аватар пользователя sas@drupal.org sas@drupal.org 5 января 2013 в 17:19

Подсчитать количество нод у которых есть tid1 и tid2

$sql = "
SELECT COUNT(tn.nid )
FROM {term_node} tn
INNER JOIN {term_node} tn1 ON tn.nid = tn1.nid
AND tn1.tid = %d
WHERE tn.tid = %d
";
args[] = tid1;
args[] = tid2;
$count = db_result(db_query(db_rewrite_sql($sql), $args)));

Аватар пользователя tolykot tolykot 6 января 2013 в 11:33

Спасибо! Работает!
А если количество терминов не известно заранее? В цикле сравнивать?

Не будет ли такие запросы слишком тяжелыми, если собираюсь повесить на клик в раскрытом фильтре?

Аватар пользователя sas@drupal.org sas@drupal.org 6 января 2013 в 12:13

"tolykot" wrote:
А если количество терминов не известно заранее? В цикле сравнивать?

Один запрос

foreach($terms as $tid){
$alias = tn . $tid;
$sql += ' INNER JOIN {term_node} ' . $alias . ' ON ' . $alias . '.nid = n.nid AND ' . $alias . '.tid = %d';
$args[] = $tid;
}
Аватар пользователя sas@drupal.org sas@drupal.org 6 января 2013 в 12:15

"tolykot" wrote:
Не будет ли такие запросы слишком тяжелыми, если собираюсь повесить на клик в раскрытом фильтре?

Не будут тяжелые, вот здесь на фильтрах работает c ajax http://crim.com.ua

Аватар пользователя tolykot tolykot 13 января 2013 в 0:04

Нашел подобную тему форума: http://www.drupal.ru/node/43207
Вот мой запрос к БД:

<?php
// получаю тиды строкой
$terms explode(","$_POST['tid']);
//собираю запрос    
$sql .= 'SELECT COUNT(DISTINCT n.nid) AS cnt FROM node n ';
foreach(
$terms as $tid){
    
$alias ' tn'.$tid;            
    
$sql .= ' INNER JOIN {term_node} ' .$alias' ON  '.$alias.'.nid = n.nid 
    AND '
.$alias.'.vid = n.vid 
    AND n.status =1
    AND '
.$alias.'.tid = %d ';
    
$args[] = $tid;
}
$count db_result(db_query(db_rewrite_sql($sql), $args));        
?>

Как работает у меня http://photoshopic.com/phony
Правда нужно еще пилить :), у меня мульти-выбор категорий, по-этому подсчет не всегда корректен.
sas@drupal.org, спасибо за помощь!