Есть сайт, на нем есть система голосований.
Таблица голосований:
|id|(остальные поля не используются в задаче)
Таблица лога ответов голосовавших:
|id|voteid|userid|voteanswers|(остальные поля не используются в задаче)
Таблица юзеров сайта 1:
|id|name|email|(остальные поля не используются в задаче)
Таблица кастомных полей профиля юзеров:
|member_id|field_2|field_3|(остальные поля не используются в задаче)
Задача: Вывести на экран такую таблицу:
…
|name|email|field_2|field_3|voteanswers|
…
Условие вывода: каждый пользователь, выводимый в этой таблице, должен проголосовать во всех голосованиях, имеющихся в базе голосований. Поле field_2!='no', а поле field_3!=''.
Честно говоря, мне трудно объяснить задачу полностью. Вот код, который у меня получился и он работает:
echo '<table cellpadding=”2″ cellspacing=”1″ bgcolor=”#5BADFF” border=”0″>
<tr bgcolor=”#000080″ class=”headrow”>
<td>Nickname</td>';
echo '<td>E-mail</td>
<td>Аппарат</td>
<td>Прошивка</td>';
while($vote = mysql_fetch_array($fetchall)) {
if(isset($_GET['thereisnospoon'])) echo '<td>'.$vote['question'].'</td>';
$votersfetch = mysql_query(”SELECT * FROM $db_voters_table WHERE voteid=”.$vote['id'].” GROUP BY userid”);
while($voter = mysql_fetch_array($votersfetch)) {
//mysql_query(”DELETE FROM $db_voters_table WHERE voteid=”.$vote['id'].” AND userid=”.$voter['userid'].” AND id!=”.$voter['id']);
if(isset($votersarr[$voter['userid']])) {
$votersarr[$voter['userid']]['vcount'] += 1;
} else {
$votersarr[$voter['userid']]['vcount'] = 1;
}
$votersarr[$voter['userid']]['voteanswers'][$vote['id']] = $voter['answerids'];
}
}
echo '</tr>';
$getanswers = mysql_query(”SELECT id, answer FROM $db_voteanswers_table ORDER BY id ASC”);
while($answer = mysql_fetch_array($getanswers)) {
$answerstexts[$answer['id']] = $answer['answer'];
}
if(isset($votersarr) && is_array($votersarr)) {
$c = 1;
foreach($votersarr as $voterid => $val) {
if($votersarr[$voterid]['vcount'] == 11) {
$voterdata = mysql_query(”SELECT m.name, m.email, f.field_2, f.field_3 FROM ibf_members m, ibf_pfields_content f WHERE m.id=”.$voterid.” AND f.member_id=”.$voterid);
echo mysql_error();
$voterdata = mysql_fetch_array($voterdata);
if($voterdata['field_2'] != 'no' && $voterdata['field_3'] != '') {
$c = $c * -1;
$col = ($c > 0) ? “#f4f4ff” : “#fafaff”;
echo '<tr bgcolor=”'.$col.'”><td>'.$voterdata['name'].'</td>';
echo '<td>'.$voterdata['email'].'</td>
<td>'.$voterdata['field_2'].'</td>
<td>'.$voterdata['field_3'].'</td>';
$votersarr[$voterid]['device'] = htmlspecialchars($voterdata['field_2']);
$votersarr[$voterid]['rom'] = htmlspecialchars($voterdata['field_3']);
foreach($votersarr[$voterid]['voteanswers'] as $vote_id => $answersarr) {
echo '<td>';
$answersarr = unserialize($answersarr);
for($i=0;$i<count($answersarr);$i++) {
echo '<li>'.$answerstexts[$answersarr[$i]].'</li>';
}
echo '</td>';
}
echo '</tr>';
flush();
}
}
}
echo '</table>';
} else {
echo '<br><br><div align=”center”>Пока нет данных</div>';
}
Комментарии:
Поле voteanswers на самом деле содержит в себе serialize-вариант массива с ID ответов. Всего опросов в базе 11, поэтому имеет мето быть условие if($votersarr[$voterid]['vcount'] == 11). Кол-во опросов не изменится, так что можно взять 11 как константу общего кол-ва опросов.
Собственно, не горит, но если кому интересно поломать голову, как этот код оптимизировать - буду рад. Просто такой вариант, сами понимаете, во многих местах фигачит кучей запросов к базе.
ЗЫ: Хотел запостить сначала в ru_mysql, но подумал, что одними запросами тут задачу решить невозможно.