Доброго времени суток! Делаю вывод сообщений для форума. Все сообщения текущей темы выводятся в цикле. В каждом сообщений выводится информация о пользователе, оставившего сообщение: права, количество сообщений, расположение файла аватары и т.д. Эта вся информация хранится в бд в одной таблице и для того чтобы ее получить для конкретного пользователя нужно в цикле вывода делать запрос [sql] SELECT * FROM users WHERE login = $author [/sql] Естественно сообщений может быть очень много и время выполнения скрипта будет увеличиваться.подскажите пожалуйста как быть в такой ситуации? Заранее спасибо!
узнаём всех пользователей которые писали на странице а потом [sql] SELECT * FROM users WHERE login = $author OR login=$autor1 ....etc... [/sql]
Если я правильно понял, то для этого надо будет перебрать массив сообщений и забить логины авторов в другой массив, затем из этого массива сформировать запрос, т.е. добавляется еще 2 цикла. Если авторов будет скажем 500-1000 это сильно будет влиять на время выполнения скрипта?
[sql]SELECT * FROM users WHERE login = $author LIMIT 1[/sql] выборка из базы закончится как только найдёт одно соответствие. зы. а вообще советую юзать id - целочисленные, с ними быстрее...
NECros88, я думаю лимит вряд ли нужен, потому что все логины уникальны и вряд ли по такому запросу их получится больше одного
amplifier а у вас нет отдельного идетефекатора автора сообщения? PHP: $result=$sql->Execute('SELECT `mesage`, `id`, `group_id`, `author` FROM `t_message` WHERE group_id='.$some_number); WHILE ($row=mysql_fetch_array($result, MYSQL_ASSOC)){ //что-то делаем с месагами $wh[]=$row['authorr'] } $where=implode("OR `login`=", $wh); $result=$sql->Execute("SELECT * FROM users WHERE login =".$where);
Все теперь понял В массиве сообщений будет всего 20 значений для текущей станицы. Поэтому авторов будет не больше 20-ти. Спасибо за совет - так и сделаю.
флоппик т.е. в том случае если логин не уникален? тогда, да с лимитом. но мне кажеться что PRIMARY KEY вещь таки обязательная, и лучше хранить в таблице сообщений именно его=)
Да, так и будет, при регистрации будет идти проверка на уникальность логина, т.е. попадание в таблицу юзеров одинаковых логинов будет пресекаться)
Дело не в пресечении, а в наличии индекса по полю. Если он будет — выборка остановится на первом найденном. Иначе — будет просмотрена вся таблица
флоппик стоп, но ведь надо вывести нескольких, что ж тогда действительно делать обращени к БД в цикле? или делать динамический лимит?
А вот про это я не знал. В поле id стоит primary key, а вот в поле логин нет. Спасибо за совет, поставлю для него тоже)
primary key - может быть только один(что логично) почему бы тогда не писать айдишник в таблицу месаг?
здесь фишка в том, что для каждого логина, который надо найти будет идти поиск до первого нахождения, т.е. если первый найден то он уже дальше не ищется, а ищутся остальные
Нет. Примари кей может быть не один. Но я говорил не про первичный ключ, а про уникальный индекс. Это разные вещи, хотя первичный ключ всегда должен быть уникальным.
флоппик я имел ввиду что при связки таблиц лучше использовать избыточную информацию(по возможности), например уникальные id, т.к. они числовые, и лёгкие.(это такое лирическое отступление, в котором я возможно не прав) (прошу прощение за оффтоп, просто мне кажется страной такая связка таблиц)
Всем большое спасибо за ответы, сделал в одном запросе из айдишников писавших посетителей на станице, все работает)
У тебя неправильная терминология ) Избыточная информация ознаачает другое, она говорит о неприведенности таблицы к нормальной форме. А идшные поля называются правильно суррогатными ключами.
[sql]ALTER TABLE `mytable` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY;[/sql] [sql]SELECT * FROM users WHERE id = $author_id LIMIT 1;[/sql] Больше думать ненужно.