Выборка и склеивание значенией из БД

Тема в разделе "PHP", создана пользователем phillip, 22 мар 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. phillip

    phillip

    Регистр.:
    4 сен 2007
    Сообщения:
    413
    Симпатии:
    15
    такой вопрос.... у меня есть таблица sites в ней три поля: id, content, active, used. Мне нужно случайным образом взять три строки со значениями, и на выходе получить переменную, которая будет содержать как бы content сразу трех сайтов.... и для каждой строки которую мы брали, used сделать равной единице. Ну то есть типа эту мы использовали.

    Пробовал так, не выходит:

    Код:
    $link = Connect2DB();
    $query = "SELECT COUNT(3) FROM `sites` WHERE `used`='N'";
    $result = mysql_query($query,$link) or die(mysql_error()."<br />\n".$query);
    $rez = mysql_fetch_assoc($result);
    $d = implode(",", $rez['content']);
    echo $d;
    Выдает такую ошибку:
    Warning: implode() [function.implode]: Invalid arguments passed
    :confused:
     
  2. jID

    jID Постоялец

    Регистр.:
    12 фев 2008
    Сообщения:
    106
    Симпатии:
    31
    Ну...
    Во-первых, SELECT COUNT(3) вообще не так считает, как ты хочешь.
    Во-вторых, насколько я помню, MySQL (про другие не знаю) не выбирает случайным образом значения.

    Я бы действовал примерно так:
    Узнай, сколько полей в БД соответствуют товим мотивам:
    "SELECT COUNT(*) AS count FROM `sites` WHERE `used`='N'";
    ...
    Выбери три рандомных, не равных друг другу числа в диапазоне значений count
    ...
    Сделай всю выборку типа "SELECT * FROM `sites` WHERE `used`='N'";
    И если значение равно одному из трёх рандомов, делай:

    "UPDATE `sites` SET `used`='1' WHERE id=$rez['id']";
    а также своё
    $d = implode(",", $rez['content']);

    Как-то так... Код лень писать...
     
  3. phillip

    phillip

    Регистр.:
    4 сен 2007
    Сообщения:
    413
    Симпатии:
    15
    хорошо, а если фиг с ним с запросом. Допустим мне не надо три строки выбирать, надо взять все значения content и слить в одно. Все равно ведь не работает. То есть для примера:

    Код:
    $link = Connect2DB();
    $query = "SELECT * FROM `sites`";
    $result = mysql_query($query,$link) or die(mysql_error()."<br />\n".$query);
    $rez = mysql_fetch_assoc($result);
    $d = implode(",", $rez['content']);
    echo $d;
    Вот. если рассматривать этот случай. Как сделать?
     
  4. serjinio

    serjinio

    Регистр.:
    10 май 2007
    Сообщения:
    439
    Симпатии:
    49
    воспользуйтесь циклом while
     
    phillip нравится это.
  5. jID

    jID Постоялец

    Регистр.:
    12 фев 2008
    Сообщения:
    106
    Симпатии:
    31
    serjinio прав. Функция mysql_fetch_assoc() читает только одну запись. Нужен весь массив - пройдёмся по нему.
    Советую не лениться и читать мануалы.
    PHP:
    $link Connect2DB();
    $query "SELECT * FROM `sites`";
    $result mysql_query($query,$link) or die(mysql_error()."<br />\n".$query);
    while (
    $row mysql_fetch_array($result)) {
      
    $d.=$row['content'];
    }
    echo 
    $d;
     
    phillip нравится это.
  6. phillip

    phillip

    Регистр.:
    4 сен 2007
    Сообщения:
    413
    Симпатии:
    15
    Спасибо!!! я сперва не понял причем тут цикл вообще :)
    Делаю счас так:
    Код:
    while ($row = mysql_fetch_assoc($result)) {
    $d.= $row['content'];
    }
    $final= gettype ($d);
    echo $final;
    
    в итоге $d у меня возвращается как строка. implode потом не получается сделать. Подскажите как сделать чтобы $d была массивом. А то я не шарю. Раздел то для начинающих в пхп)

    о!!! ВСЁ!!! ЗАРАБОТАЛО!!! СПАСИБО ВАМ ЕЩЕ РАЗ!
    теперь у меня такая задачка.... надо сделать не "SELECT * FROM `sites`" а селект 3 случайных строки. помогите пожалуйста)
     
  7. serjinio

    serjinio

    Регистр.:
    10 май 2007
    Сообщения:
    439
    Симпатии:
    49
    PHP:
    while($row mysql_fetch_assoc($result))  
    {
       
    $array[] = $row['content'];
    }  
    echo 
    '<pre>'
     
    print_r ($array);
    echo 
    '</pre>';
    если нужен массив...

    PHP:
    ORDER BY RAND() LIMIT 3
    случайные строки..
     
    jID и phillip нравится это.
  8. waldicom

    waldicom Создатель

    Регистр.:
    15 мар 2009
    Сообщения:
    41
    Симпатии:
    3
    В качестве дополнения: если база, то такие запросы не самое лучшее для быстродействия. Лучше использовать два запроса.
     
  9. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    И чем же лучше (с документальным обоснованием)?
     
  10. Arqin

    Arqin

    Регистр.:
    17 мар 2009
    Сообщения:
    185
    Симпатии:
    37
    ORDER BY RAND() действительно работает очень медленно при большом количестве записей, т.к. RAND() сначала производит выборку всех записей, потом выстраивает их в отсортированном порядке и только после этого выдаст вам те 3 записи.
    давно уже известный факт...
    как вариант можно использовать конструкцию типа:
    Код:
    SELECT s.*, rand() as Ra FROM `sites` s order by Ra
    
    при большом количестве записей. Такая конструкция работает быстрее. Проверенно на практике. При 7000 записей запрос работает около 0.003 секунд. Тогда как предложенный вами вариант около 0.3 секунд.
     
Статус темы:
Закрыта.