SELECT *
FROM people
LEFT JOIN votestat ON peopleid = ...
WHERE ...
AND likedis='like' AND ipadress=...
ORDER BY ...
Уменьшение количества запросов
У меня есть следующая вещь:
Из базы в цикле вытягиваются данные, человеки, за которых можно проголосовать за или против. Ограничение только по айпи. Так вот, я задумал сделать так, что если пользователь уже голосовал, то сама кнопка для голосования не будет ему показываться, но я никак не могу сообразить как организовать это все дело так, чтобы не использовать запросы каждый раз в самом цикле, как это организовано сейчас у меня.
Подскажите, пожалуйста, как сделать так, чтобы выбрать из базы сначала все айпи-адреса и уже только потом вложенным циклом проверять или он есть в списке? То есть как уменьшить количество запросов?
Свой код привожу ниже:
Код:
<?php
$result = mysql_query("SELECT * FROM people ".$where." ORDER ".$sortby."");
$myrow = mysql_fetch_array($result);
if (mysql_num_rows($result) > 0)
{
$realip = getenv(HTTP_X_FORWARDED_FOR);
if ($realip == ''){$realip = $_SERVER['REMOTE_ADDR'];}
do
{
if ($myrow['avatar'] == '-')
{
if ($myrow['sex'] == '1') {$avatar = 'images/man.png';}
if ($myrow['sex'] == '0') {$avatar = 'images/woman.png';}
}
if ($myrow['avatar'] != '-') {$avatar = "timthumb.php?src=".$myrow['avatar']."&a=t&w=195&h=200&q=100";}
$resultfindip = mysql_query("SELECT * FROM votestat WHERE peopleid='$myrow[id]' AND likedis='like' AND ipadress='$realip'",$db);
if (mysql_num_rows($resultfindip) > 0) {$likehref = "";}
else {$likehref = "<a class='like' name='$myrow[id]'>ХОРОШО! (<strong>$myrow[likes]</strong>)</a>";}
$stroka='';
if(($i+1)%4==0) $stroka='</tr><tr>';
printf ("
<td align='center' valign='middle' width='200'>
<img src='$avatar' />
<br />
<strong>%s</strong><br />
%s<br />
<a href='comments.php?id=%s' class='comments fancybox.iframe'><img title='Отзывы' src='images/comments.png'></a>
<a href='add_comment.php?id=%s' class='addcomment fancybox.iframe'><img title='Добавить отзыв' src='images/addcomments.png'></a>
<br>
$likehref
<a class='dislike' name='%s'>ПЛОХО! (<strong>%s</strong>)</a>
</td>
$stroka
",$myrow["posada"],$myrow["name"],$myrow["id"],$myrow["id"],$myrow["id"],$myrow["dislikes"]);
$i++;
}
while ($myrow= mysql_fetch_array($result));
}
else
{
echo '<br /><p align="center"><strong>У цій групі поки нікого немає!</strong></p>';
}
?>
$result = mysql_query("SELECT * FROM people ".$where." ORDER ".$sortby."");
$myrow = mysql_fetch_array($result);
if (mysql_num_rows($result) > 0)
{
$realip = getenv(HTTP_X_FORWARDED_FOR);
if ($realip == ''){$realip = $_SERVER['REMOTE_ADDR'];}
do
{
if ($myrow['avatar'] == '-')
{
if ($myrow['sex'] == '1') {$avatar = 'images/man.png';}
if ($myrow['sex'] == '0') {$avatar = 'images/woman.png';}
}
if ($myrow['avatar'] != '-') {$avatar = "timthumb.php?src=".$myrow['avatar']."&a=t&w=195&h=200&q=100";}
$resultfindip = mysql_query("SELECT * FROM votestat WHERE peopleid='$myrow[id]' AND likedis='like' AND ipadress='$realip'",$db);
if (mysql_num_rows($resultfindip) > 0) {$likehref = "";}
else {$likehref = "<a class='like' name='$myrow[id]'>ХОРОШО! (<strong>$myrow[likes]</strong>)</a>";}
$stroka='';
if(($i+1)%4==0) $stroka='</tr><tr>';
printf ("
<td align='center' valign='middle' width='200'>
<img src='$avatar' />
<br />
<strong>%s</strong><br />
%s<br />
<a href='comments.php?id=%s' class='comments fancybox.iframe'><img title='Отзывы' src='images/comments.png'></a>
<a href='add_comment.php?id=%s' class='addcomment fancybox.iframe'><img title='Добавить отзыв' src='images/addcomments.png'></a>
<br>
$likehref
<a class='dislike' name='%s'>ПЛОХО! (<strong>%s</strong>)</a>
</td>
$stroka
",$myrow["posada"],$myrow["name"],$myrow["id"],$myrow["id"],$myrow["id"],$myrow["dislikes"]);
$i++;
}
while ($myrow= mysql_fetch_array($result));
}
else
{
echo '<br /><p align="center"><strong>У цій групі поки нікого немає!</strong></p>';
}
?>
IP-адреса, кстати, надо хранить не в строках, а в числах. Ищите функции конвертации. Вроде как есть одна, называется ip2long.
Что за "likedis='like'"? Почему строковое значение? Константы числовые вводите.
По поводу самого запроса - делайте LEFT JOIN.
Код:
В случае, если запись в таблице votestat на найдена, то её поля в результате запроса будут равны NULL.
Мой совет - полностью перепроектировать базу данных с нуля. Дать нормальные имена и нормально определить форматы данных.
А как это все потом заюзать?
http://www.anton-pribora.ru/articles/mysql/mysql-join
очень полезно, доходчиво, и ваще...
Начните со статьи MySQL немного о JOIN'ах -
очень полезно, доходчиво, и ваще...
http://market.yandex.ru/search.xml?hid=90829&text=%D1%E0%EC%EE%F3%F7%E8%F2%E5%EB%FC%20MySQL%205%20%CA%F3%E7%ED%E5%F6%EE%E2%20%CC.%20%C2.%2C%20%D1%E8%EC%E4%FF%ED%EE%E2%20%C8.%20%C2. после чего спроектировать структуру базы с нуля.
Текущую реализацию выкинуть полностью.
Нужно не запросы уменьша, а начать хотя бы с реляционных основ. Нормальные формы, объединения, условия в выборках. Рекомендую проштудировать эту книгу:
Текущую реализацию выкинуть полностью.