Подскажите как реализовать, а то я что-то запутался. У меня 2 запроса к БД 1. Вытягивает все Distinct recipient из таблицы Calls 2. По найденным recipient вытягивает все остальные данные из той же таблицы. Подскажите примерно как должна выглядеть такая конструкция?
на 99,9% уверен, что можно решить задачу путем модификации SQL-запроса. нужно использовать join'ы, тогда можно будет сделать все за один проход. пиши подробнее. структуру таблицы, какую логику нужно реализовать.
Ну структура таблицы [sql] CREATE TABLE IF NOT EXISTS `Calls` ( `id_call` int(100) NOT NULL AUTO_INCREMENT, `personal` enum('0','1') CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `contract` varchar(11) NOT NULL, `group` varchar(11) NOT NULL, `phone_number` varchar(11) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, `date_of_call` date DEFAULT NULL, `time_of_call` text, `duration` text, `rounded_duration` text NOT NULL, `cost` float DEFAULT NULL, `outgoing` varchar(11) NOT NULL, `recipient` varchar(16) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, `type_of_call` text NOT NULL, `description` text CHARACTER SET utf8 COLLATE utf8_unicode_ci, `connection_type` text CHARACTER SET utf8 COLLATE utf8_unicode_ci, `station_number` varchar(11) NOT NULL, `volume` float DEFAULT NULL, `roaming` text CHARACTER SET utf8 COLLATE utf8_unicode_ci, PRIMARY KEY (`id_call`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=73746 ;[/sql] А если более детально то такая схема нужна специально, потому-что после первого запроса строится список, после второго запроса список заполняется таблицами. Т.е. список имеет вид recipient1 recipient2 recipient3 и т.д. при клике на recipient1 из него выпадают все данные связанные с этим номером, которые имеются в таблице. В результате имеем 2 запроса 1 [sql]SELECT distinct recipient FROM Calls WHERE phone_number=$phone_number and Calls.Cost>0 order by recipient[/sql] и второй [sql]SELECT * FROM Calls WHERE phone_number=$phone_number and recipient=$show[recipient] and Calls.Cost>0 order by date_of_call[/sql] Только есть ещё 1 момент, не пойму почему фторой запрос не видит $show['recipient'], пробовал вместо него ставить переменную, бесполезно. Ну хотя суть вопроса пока не в этом. Для начала нужно понять как сделать чтобы вся конструкция работала так как нужно. для наглядности, вот линка http://www.jankoatwarpspeed.com/post/2009/07/20/Expand-table-rows-with-jQuery-jExpand-plugin.aspx Примерно так, только внутри не список а таблица
значит так. делаем селект один(!) [sql]SELECT * FROM Calls WHERE phone_number=$phone_number and Calls.Cost>0 order by recipient[/sql] Далее делаем один(!) цикл PHP: $rec = ''; while ($row = mysql_fetch_assoc($res)) { if ($row['recipient'] != $rec) { if ($rec != '') echo ("</table>"); $rec = $row['recipient']; echo ("<div>".$rec." recipents calls:</div><table><tr>Phone number<td>Duration</td></tr>"); // тут столбцы по необходимости добавишь } echo('<tr><td>'.$row['phone_number'].'</td><td>'.$row['duration'].'</td></tr>'); } if ($rec != '') echo ("</table>"); Если ты пойдешь своим путем - ... короче, не делай этого, у тебя будет миллион лишних обращений к базе и потеря в производительности. Приучайся сразу делать все правильно, учись искать пути оптимизации прямо на этапе проектирования.
Как формируется итоговая таблица? Сразу вся? Или по нажатию информация подгружается AJAX'ом? Но незабываем о вреде преждевременной оптимизации. =))
судя по той ссылке, которую он дал, там аякса нет, весь стафф генериться один раз, а все красивости уже на клиенте жава-скриптом
Вот полный код, чтобы было понятнее о чем я говорю. А что должно получиться в итоге (см.ссылку в предыдущем посте) PHP: $recipients="SELECT distinct recipient FROM Calls WHERE phone_number=$phone_number AND Calls.date_of_call BETWEEN DATE_SUB(DATE_SUB(CURDATE(), INTERVAL 1 MONTH), INTERVAL DAY(CURDATE())-1 DAY) AND DATE_SUB(CURDATE(), INTERVAL DAY(CURDATE()) DAY) and Calls.Cost>0 order by recipient"; $find=mysql_query($recipients); $show=mysql_fetch_array($find); $phone=$show['recipient']; if($find) { $query="SELECT * FROM Calls WHERE phone_number=$phone_number AND Calls.date_of_call BETWEEN DATE_SUB(DATE_SUB(CURDATE(), INTERVAL 1 MONTH), INTERVAL DAY(CURDATE())-1 DAY) AND DATE_SUB(CURDATE(), INTERVAL DAY(CURDATE()) DAY) and recipient=$phone and Calls.Cost>0 order by date_of_call"; $result=mysql_query($query); $myrow=mysql_fetch_array($result); echo $myrow['phone_number']; $o=array($tcalls); $o[]="<form method=\"post\" action=\"page.php\" >"; $total=0; $total_personal=0; $total_rouming=0; $id=0; $month=date('M'); $day=date('d'); while($show = mysql_fetch_array($find)) {if($id==0) { $id=1; $a=explode('-',$myrow['date_of_call']); $month=$a[0]; $day=$a[1]; } $value=$myrow['phone_number'].'@'.$myrow['date_of_call'].'@'.$myrow['time_of_call']; if($myrow['cost']!='' and $myrow['cost']!=null) { if($myrow['personal']==1) {$total_personal+=$show['cost'];} if($myrow['rouming']!=' ' and $myrow['rouming']!=null ) {$total_rouming+=$myrow['cost'];} $total+=$myrow['cost']; if ($total_personal>500) {$stat_VAT=$total_personal*$VAT;} if ($stat_VAT!='' and $stat_VAT!=null) {$stat_total_with_VAT=$stat_VAT+$total_personal;} } if($myrow['personal']==1) {$o[]="<td class='check'><input type=checkbox name='call_select[]' checked data-on='Personal' data-off='Business' value='$value' ></td>";} else {$o[]="<td class='check'><input type=checkbox name='call_select[]' data-on='Personal' data-off='Business' value='$value' ></td>";} $o[]="<td></td><td>{$show['recipient']}</td><td><div class='arrow'></div></td>"; //вытягиваем номер телефона для шапки $o[]="<td>{$myrow['cost']}</td>"; //стоимость звонка на этот номер $o[]="<td>{$myrow['recipient']}</td>"; //указываем на какой номер (просто чтобы увидеть что данные тянутся правильно) $o[]="<td>{$myrow['date_of_call']}</td>"; //дата звонка $o[]="<td>{$myrow['time_of_call']}</td>"; //время звонка $o[]="<td>{$myrow['duration']}</td>"; //длительность $o[]="<td>{$myrow['type_of_connect']}</td>"; //тип соединение $o[]="<td>{$myrow['volume']}</td>"; //объём $o[]="<td>{$myrow['roaming']}</td>"; //роуминг $o[]="</td></tr>"; //только всю информацию по звонкам нужно вытягивать через другой цикл, потому-что на один и тот же номер может быть несколько звонков } $o[]="</table>"; $o[]="<input type='submit' name='set_personal' value='RESULT'>"; $o[]="</form><br>";
Просто переменная. C помощью нее производится отслеживание того, что в результирующем множестве пошли данные по новому ресипиенту. В таком случае закрывается предыдущая таблица и открывается новая.