Cheshir 21 01/17/13 20:03 Вопрос к программистам sql каким образом преобразовать sql запрос к БД: if( count($data['topic_data']) ) { $reps = array(); $tids = array_keys( $data['topic_data'] ); $this->DB->build( array( 'select' => 'rc.rep_points', 'from' => array('reputation_cache' => 'rc'), 'add_join' => array( 0 => array( 'select' => 'p.topic_id', 'from' => array('posts' => 'p'), 'where' => 'rc.type_id=p.pid', 'type' => 'inner', ), ), 'where' => 'p.topic_id IN ('.implode(',', $tids).') AND rc.app="forums"', 'group' => 'p.topic_id', 'order' => 'p.pid ASC', ) ); $this->DB->execute(); while( $row = $this->DB->fetch() ) { $reps[ $row['topic_id'] ] = $row['rep_points']; } foreach( $tids as $v ) { $data['topic_data'][$v]['rep_firstpost'] = ( $reps[$v] ) ? $reps[$v] : 0; } } (благодарность за код siv1987) в вариант для вставки в html (шаблон страницы IP.Content) По примеру кода-запроса к БД <if test="intval($record['record_topicid'])"> <if test="($forum = $this->DB->buildAndFetch( array('select' => 'f.id, f.name, f.name_seo', 'from' => array('forums' => 'f'), 'where' => 'f.id=t.forum_id', 'add_join' => array( array('from' => array('topics' => 't'), 'where' => 't.tid='.$record['record_topicid'])))))!==FALSE"> {$forum['name']} </if> </if> Поделиться сообщением Ссылка на сообщение
siv1987 2628 01/17/13 20:32 <php> $forum = $this->DB->buildAndFetch( array('select' => 'f.id, f.name, f.name_seo', 'from' => array('forums' => 'f'), 'where' => 'f.id=t.forum_id', 'add_join' => array( array('from' => array('topics' => 't'), 'where' => 't.tid='.$record['record_topicid'])))); </php> .... <if test="$forum['id']"> {$forum['name']} </if> Поделиться сообщением Ссылка на сообщение
Cheshir 21 01/17/13 20:38 Видимо неправильно поняли, или я так объяснил. Вы написали запрос на вывод названия форума. А мне нужен вариант по первому коду (под первым спойлером). Под вторым спойлером пример... Поделиться сообщением Ссылка на сообщение
siv1987 2628 01/17/13 20:57 Чем первый вариант не устраивает? Поделиться сообщением Ссылка на сообщение
Cheshir 21 01/17/13 21:07 Чем первый вариант не устраивает? Первый выриант для форума, а мне нужно вывести на главную ИП.Контента. sql запросы понимаю, а в общую картину сложить не могу...обратный порядок должен быть... сравнение с 't.tid='.$record['record_topicid' и вывод из reputation_cache rep_points согласно...все запутался... в общем вывод репутации первого сообщения, насколько понимаю в ИП.Контенте можно сравнивать только по $record['record_topicid', больше пока не нашел Поделиться сообщением Ссылка на сообщение
siv1987 2628 01/17/13 21:12 Если речь о IP.Content тогда хз... Поделиться сообщением Ссылка на сообщение
Cheshir 21 01/17/13 21:22 Но запрос то остается запросом... единственный важный момент из IP.Content - с чем сравнивать запрос. Как должен выглядеть запрос в таком случае, если сначала сравнивается ID топика с .$record['record_topicid']? - .$record['record_topicid'] из IP.Content - это и есть id топика в ip.board если словами, то по типу:если't.tid='.$record['record_topicid']то t.tid сравниваем с чем то (еще не понял как вы вытягиваете id первого сообщения, наверно функцией foreach)получаем репутацию этого t.tid и выводим результат... ужасно звучит... понимаю Поделиться сообщением Ссылка на сообщение
siv1987 2628 01/17/13 21:31 еще не понял как вы вытягиваете id первого сообщения, наверно функцией foreachПри помощью GROUP BY topic_id ORDER BY pid ASCforeach служит там совсем для другого, он добавляет в массив topic_data полученные данные. Поделиться сообщением Ссылка на сообщение
Cheshir 21 01/17/13 21:48 да...догадался... но по логике должна работать такая комбинация if( count($data['topic_data']) ) { $reps = array(); $tids = array_keys( $data['topic_data'] ); $this->DB->build( array( 'select' => 'rc.rep_points', 'from' => array('reputation_cache' => 'rc'), 'add_join' => array( 0 => array( 'select' => 'p.topic_id', 'from' => array('posts' => 'p'), 'where' => 'rc.type_id=p.pid', 'type' => 'inner', ), ), 'where' => 'p.topic_id IN ('.implode(',', $tids).') AND rc.app="forums"', 'group' => 'p.topic_id', 'order' => 'p.pid ASC', ) ); $this->DB->execute(); while( $row = $this->DB->fetch() ) { $reps[ $row['topic_id'] ] = $record['record_topicid']; } foreach( $tids as $v ) { $data['topic_data'][$v]['rep_firstpost'] = ( $reps[$v] ) ? $reps[$v] : 0; } } где$reps[ $row['topic_id'] ] = $record['record_topicid'];сравнение и в шаблон {$data['rep_firstpost']} только нефига не работает... Поделиться сообщением Ссылка на сообщение
siv1987 2628 01/17/13 21:55 но по логике должна работать такая комбинацияНу эта комбинация была написана для конкретного файла, я не уверен что в таком виде она будет работать в другом месте. где$reps[ $row['topic_id'] ] = $record['record_topicid'];сравнениеЭто совсем не сравнение, а присвоение. Сравнение так может быть только в sql запросе, а здесь уже php. Напишите какие данные в этом шаблоне есть (имена переменных)и какие данные нужно вытащить (имена таблиц и полей) Поделиться сообщением Ссылка на сообщение
Cheshir 21 01/17/13 22:01 Запросом print_r( $variable ); в шаблоне сделать? Поделиться сообщением Ссылка на сообщение
Cheshir 21 01/21/13 22:55 Ничего не выходит... <if test="intval($record['record_topicid'])"> <if test="( $record['record_topicid'] = $this->DB->buildAndFetch( array( 'select' => 'p.topic_id', 'from' => array('posts' => 'p'), 'where' => { $row['topic_id'] = $row['pid']; } 'add_join' => array( array( 'select' => 'rep_points', 'from' => array('reputation_cache' => 'rc'), 'where' => { $row['type_id'] = $row['rep_points']; } ))))!==FALSE"> </if> </if> Совсем не в ту степь? Поделиться сообщением Ссылка на сообщение
siv1987 2628 01/21/13 23:13 Жесть. Как вы думаете что вернет if( intval( '1" SQL' ) ) - true или false? Я уже десять раз писал, не используйте запросы к бд в if test="". Для этого есть спец теги .Запрос составлен неверно. Правильно он будет примерно таким <php> $_data = $this->DB->buildAndFetch( array( 'select' => 'p.topic_id', 'from' => array('posts' => 'p'), 'where' => 'p.topic_id='.$record['record_topicid'].' AND rc.type="pid"', 'add_join' => array( array( 'select' => 'rc.rep_points', 'from' => array('reputation_cache' => 'rc'), 'where' => 'rc.type_id=p.pid', ) ) ) ); </php> а ниже в шаблоне <if test="$_data['topic_id']"> Мега репа: {$_data['rep_points']} </if> Поделиться сообщением Ссылка на сообщение
Cheshir 21 01/22/13 06:11 Почему в if нельзя использовать запросы к бд?! оО с выводом названия форума работает же =) Поделиться сообщением Ссылка на сообщение
Ritsuka 540 01/22/13 08:34 Почему в if нельзя использовать запросы к бд?!Программирование для битардов. <php>$a = func($c)</php> ===> <?php $a = func($c); ?> <if test="$a = func($c)"></if> ===> <php if($a = func($c)) { ?><?php } ?> Если вам нужно выполнить "$a = func($c);", зачем вам лишняя операция if и пара десятков лишних конструкций в итоговом коде шаблона? Ресурсов сервера больно до*уя? Поделиться сообщением Ссылка на сообщение