Здрасьте. SQL я пока знаю неважно, в ближайшее время планирую подтянуть.
Тренирую все изученные навыки и хочу объединить их вместе, сделав собственный скрипт гостевой книги. Так вот, есть 2 таблицы, user и posts.
user - здесь имена зарегистрированных пользователей
Связанные таблицы делать пока не умею, поэтому чтобы в гостевой отображалось имя пользователя, который добавил запись, с каждым новым запросом на выборку из базы делаю запрос на выборку имени юзера (внутри цикла).
Знаю, что циклы - вообще довольно ресурсоёбкая вещь, поэтому вопрос: можно ли как-то улучшить данный код?
Так-то всё работает, но кривость данного кода как-то мучает

$sql = "SELECT * FROM `posts` order by `date`";
$result = mysql_query($sql) or die(mysql_error());
$table = "<table border='0' cellcpacing='1' bgcolor='#000000' cellpadding='0' align='center' width='50%'";
while ($row = mysql_fetch_assoc($result))
{
$login_select = mysql_query ("
select `login` from `user` where id = '".$row['user']."'
") or die (mysql_error());
$res1 = mysql_result($login_select, 0);
$table .= "<tr bgcolor=\"#B7D0DF\" height='100px'>\n";
$table .= "<td bgcolor=\"#BFDDF2\" width='100px'>
Добавил:<br /> ".$res1." </td>\n";
$table .= "<td width='70px'> Дата: ".$row['date']."</td>\n";
$table .= "<td width='400px'>".$row['text']."</td>\n";
$table .= "</tr>\n";
}
$table .= "</table>\n";
echo $table;
Спустя 1 час, 57 минут, 57 секунд (9.03.2010 - 19:09) FatCat написал(а):
Лучше в один запрос по связанным таблицам.
Как-то так примерно:
$query = "SELECT u.*, p.* FROM user u
LEFT JOIN posts p ON(u.id=p.user)
WHERE u.id = ".intval($_GET['user_id']);
По запросу получим и всю информацию о юзере, и все его сообщения.
Спустя 5 часов, 51 минута, 19 секунд (10.03.2010 - 01:00) netruxa написал(а):
ну да тут либо связанную табличку делать, либо можно перед самым запросом в массив user загнать все имена зарегиных пользователей ($user[1]='admin' и тд) и после при выводе гостевой, не обращаться лишний раз к БД, а просто вызывать массив $user
Спустя 36 минут, 40 секунд (10.03.2010 - 01:37) FatCat написал(а):
Цитата (netruxa @ 10.03.2010 - 02:00) |
в массив user загнать все имена зарегиных пользователей |
Для чата именно так и сделал у себя. Но тогда обязательно должна быть очистка базы от давно не заходивших пользователей.
Для форума такой подход не годится. При числе юзеров в базе больше 600-700 запрос по проиндексированному полю будет работать быстрее, чем обращение к элементу массива php - цифры получил эмпирическим путем под денвером на домашнем ноутбуке; на других конфигурациях серверов цифры могут быть другими.