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

Статус
В этой теме нельзя размещать новые ответы.

phillip

Полезный
Регистрация
4 Сен 2007
Сообщения
411
Реакции
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:
 
Ну...
Во-первых, 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']);

Как-то так... Код лень писать...
 
хорошо, а если фиг с ним с запросом. Допустим мне не надо три строки выбирать, надо взять все значения 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;

Вот. если рассматривать этот случай. Как сделать?
 
воспользуйтесь циклом while
 
хорошо, а если фиг с ним с запросом. Допустим мне не надо три строки выбирать, надо взять все значения 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;

Вот. если рассматривать этот случай. Как сделать?
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;
 
Спасибо!!! я сперва не понял причем тут цикл вообще :)
Делаю счас так:
Код:
while ($row = mysql_fetch_assoc($result)) {
$d.= $row['content'];
}
$final= gettype ($d);
echo $final;
в итоге $d у меня возвращается как строка. implode потом не получается сделать. Подскажите как сделать чтобы $d была массивом. А то я не шарю. Раздел то для начинающих в пхп)

о!!! ВСЁ!!! ЗАРАБОТАЛО!!! СПАСИБО ВАМ ЕЩЕ РАЗ!
теперь у меня такая задачка.... надо сделать не "SELECT * FROM `sites`" а селект 3 случайных строки. помогите пожалуйста)
 
PHP:
while($row = mysql_fetch_assoc($result))  
{
   $array[] = $row['content'];
}  
echo '<pre>'; 
 print_r ($array);
echo '</pre>';
если нужен массив...

PHP:
ORDER BY RAND() LIMIT 3
случайные строки..
 
И чем же лучше (с документальным обоснованием)?
 
И чем же лучше (с документальным обоснованием)?

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