За последние 24 часа нас посетили 17715 программистов и 1659 роботов. Сейчас ищут 955 программистов ...

Обращение к БД в многократном цикле

Тема в разделе "PHP для новичков", создана пользователем amplifier, 16 дек 2008.

  1. amplifier

    amplifier Активный пользователь

    С нами с:
    19 ноя 2008
    Сообщения:
    49
    Симпатии:
    0
    Доброго времени суток!
    Делаю вывод сообщений для форума. Все сообщения текущей темы выводятся в цикле. В каждом сообщений выводится информация о пользователе, оставившего сообщение: права, количество сообщений, расположение файла аватары и т.д.
    Эта вся информация хранится в бд в одной таблице и для того чтобы ее получить для конкретного пользователя нужно в цикле вывода делать запрос
    [sql]
    SELECT * FROM users WHERE login = $author
    [/sql]
    Естественно сообщений может быть очень много и время выполнения скрипта будет увеличиваться.подскажите пожалуйста как быть в такой ситуации?
    Заранее спасибо!
     
  2. GudGuy

    GudGuy Активный пользователь

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    узнаём всех пользователей которые писали на странице а потом
    [sql] SELECT * FROM users WHERE login = $author OR login=$autor1 ....etc... [/sql]
     
  3. amplifier

    amplifier Активный пользователь

    С нами с:
    19 ноя 2008
    Сообщения:
    49
    Симпатии:
    0
    Если я правильно понял, то для этого надо будет перебрать массив сообщений и забить логины авторов в другой массив, затем из этого массива сформировать запрос, т.е. добавляется еще 2 цикла. Если авторов будет скажем 500-1000 это сильно будет влиять на время выполнения скрипта?
     
  4. NECros88

    NECros88 Активный пользователь

    С нами с:
    16 дек 2008
    Сообщения:
    5
    Симпатии:
    0
    [sql]SELECT * FROM users WHERE login = $author LIMIT 1[/sql]

    выборка из базы закончится как только найдёт одно соответствие.
    зы. а вообще советую юзать id - целочисленные, с ними быстрее...
     
  5. amplifier

    amplifier Активный пользователь

    С нами с:
    19 ноя 2008
    Сообщения:
    49
    Симпатии:
    0
    NECros88, я думаю лимит вряд ли нужен, потому что все логины уникальны и вряд ли по такому запросу их получится больше одного
     
  6. GudGuy

    GudGuy Активный пользователь

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    amplifier
    а у вас нет отдельного идетефекатора автора сообщения?
    PHP:
    1.  
    2. $result=$sql->Execute('SELECT `mesage`, `id`, `group_id`, `author` FROM `t_message` WHERE group_id='.$some_number);
    3. WHILE ($row=mysql_fetch_array($result, MYSQL_ASSOC)){
    4. //что-то делаем с месагами
    5. $wh[]=$row['authorr']
    6. }
    7. $where=implode("OR `login`=", $wh);
    8. $result=$sql->Execute("SELECT * FROM users WHERE login =".$where);
    9.  
     
  7. amplifier, если у тебя UK по логинам, то лимит не нужен. Но если нет, то он
     
  8. GudGuy

    GudGuy Активный пользователь

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    флоппик
    UK?
     
  9. amplifier

    amplifier Активный пользователь

    С нами с:
    19 ноя 2008
    Сообщения:
    49
    Симпатии:
    0
    Все теперь понял :) В массиве сообщений будет всего 20 значений для текущей станицы. Поэтому авторов будет не больше 20-ти. Спасибо за совет - так и сделаю.
     
  10. GudGuy

    GudGuy Активный пользователь

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    флоппик
    т.е. в том случае если логин не уникален? тогда, да с лимитом. но мне кажеться что PRIMARY KEY вещь таки обязательная, и лучше хранить в таблице сообщений именно его=)
     
  11. amplifier

    amplifier Активный пользователь

    С нами с:
    19 ноя 2008
    Сообщения:
    49
    Симпатии:
    0
    Да, так и будет, при регистрации будет идти проверка на уникальность логина, т.е. попадание в таблицу юзеров одинаковых логинов будет
    пресекаться)
     
  12. Дело не в пресечении, а в наличии индекса по полю.
    Если он будет — выборка остановится на первом найденном. Иначе — будет просмотрена вся таблица
     
  13. GudGuy

    GudGuy Активный пользователь

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    флоппик
    стоп, но ведь надо вывести нескольких, что ж тогда действительно делать обращени к БД в цикле? или делать динамический лимит?
     
  14. amplifier

    amplifier Активный пользователь

    С нами с:
    19 ноя 2008
    Сообщения:
    49
    Симпатии:
    0
    А вот про это я не знал. В поле id стоит primary key, а вот в поле логин нет. Спасибо за совет, поставлю для него тоже)
     
  15. GudGuy

    GudGuy Активный пользователь

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    primary key - может быть только один(что логично)
    почему бы тогда не писать айдишник в таблицу месаг?
     
  16. free-bits

    free-bits Активный пользователь

    С нами с:
    13 ноя 2008
    Сообщения:
    296
    Симпатии:
    0
    Адрес:
    г. Красноярск
    здесь фишка в том, что для каждого логина, который надо найти будет идти поиск до первого нахождения, т.е. если первый найден то он уже дальше не ищется, а ищутся остальные
     
  17. GudGuy

    GudGuy Активный пользователь

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    login = $author LIMIT 1 OR login = $author1 LIMIT 1 так что ли? я чё то туплю...
     
  18. Нет. Примари кей может быть не один.
    Но я говорил не про первичный ключ, а про уникальный индекс. Это разные вещи, хотя первичный ключ всегда должен быть уникальным.
     
  19. amplifier

    amplifier Активный пользователь

    С нами с:
    19 ноя 2008
    Сообщения:
    49
    Симпатии:
    0
    Да, я че то гоню, primary key это же ключевое поле :) можно и по айди там без разницы
     
  20. GudGuy

    GudGuy Активный пользователь

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    флоппик
    я имел ввиду что при связки таблиц лучше использовать избыточную информацию(по возможности), например уникальные id, т.к. они числовые, и лёгкие.(это такое лирическое отступление, в котором я возможно не прав)
    (прошу прощение за оффтоп, просто мне кажется страной такая связка таблиц)
     
  21. amplifier

    amplifier Активный пользователь

    С нами с:
    19 ноя 2008
    Сообщения:
    49
    Симпатии:
    0
    Всем большое спасибо за ответы, сделал в одном запросе из айдишников писавших посетителей на станице, все работает)
     
  22. У тебя неправильная терминология )
    Избыточная информация ознаачает другое, она говорит о неприведенности таблицы к нормальной форме.
    А идшные поля называются правильно суррогатными ключами.
     
  23. NECros88

    NECros88 Активный пользователь

    С нами с:
    16 дек 2008
    Сообщения:
    5
    Симпатии:
    0
    [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]

    Больше думать ненужно.