С Новым годом! Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625

Пустые строки в таблице данных

03.01.2013, 23:45. Показов 1906. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет.

Производил выборку данных, на основе генератора случайных чисел. Пример:

PHP
1
2
3
4
$all = mysql_num_rows(mysql_query("SELECT `id` FROM `base_1"));
$rnd = mt_rand(1, $all);
$get_name = mysql_fetch_array(mysql_query("SELECT `name` FROM `base_1` WHERE `id`='$rnd'"));
echo $get_name['name'];
Возникла проблема с выборкой данных, после удаления определенных строк из таблицы. Скажем, в таблице имеется 3 записи. Удаляю вторую и получается вот такая картина(изображение).

Получается так, что если генератор выдаст число 2, то мы не получим никаких данных. Есть ли другой, такой же простой способ выборки случайных данных из БД?

В принципе можно, церез цикл записать в массив все имеющиеся id в базе, перемешать данные в массиве и вывести запись. Пример:

PHP
1
2
3
4
5
6
7
8
9
$get_id = mysql_query("SELECT `id` FROM `base_1`");
$array_fr = array();
while($result_id = mysql_fetch_assoc($get_id)) {
        if($result_id['id']!=NULL) { 
            $array_fr[] = $result_id['id']; 
        } else {  break;  }
}
suffle($array_fr);
echo $array_fr['0'];
Или вот так, с помощью того же генератора:
PHP
1
2
3
4
5
6
7
8
9
10
$get_id = mysql_query("SELECT `id` FROM `base_1`");
$all = mysql_num_rows(mysql_query("SELECT `id` FROM `base_1"));
$array_fr = array();
while($result_id = mysql_fetch_assoc($get_id)) {
        if($result_id['id']!=NULL) { 
            $array_fr[] = $result_id['id']; 
        } else {  break;  }
}
$rnd = mt_rand(1, $all);
echo $array_fr[$rnd];
Но если у нас в базе будет, скажем, 5 тысяч записей(соответственно столько же и id), не повлияет ли это на время выборки и вообще, на производительность? А то ведь пользователи, не любят ждать...
Миниатюры
Пустые строки в таблице данных  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.01.2013, 23:45
Ответы с готовыми решениями:

Пустые строки в базе при вставке данных
Всем привет! Уже не раз читаю споры по поводу уроков Попова. ну и фиг с ним. Решил забить на него и попытался сам написать регистрацию....

Не выводить в сводной таблице пустые строки
Всем добрый вечер. Есть огромная таблица с данными, но один столбец заполнен не полностью, заполнен только в случае наличия продажи,...

Как убрать пустые строки в таблице?
Добрый день. У меня цикл <?php foreach($fieldset as $field) { ?> <tr> <td> <?php echo $field; ?> <!-- выводим название...

6
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
04.01.2013, 00:23
используйте лимит вместо where
SQL
1
..... LIMIT N, 1
- где N ваше число

Добавлено через 3 минуты
PHP
1
2
3
4
5
6
$res = mysql_query('SELECT COUNT(1) FROM `base_1');
$row = mysql_fetch_array($res, MYSQL_NUM);
$all = !empty($row[0]) ? $row[0] : 1;
$rnd = mt_rand(0, $all);
$get_name = mysql_fetch_assoc(mysql_query('SELECT `name` FROM `base_1` LIMIT ' . $rnd . ',1'));
echo $get_name['name'];
2
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
04.01.2013, 15:22  [ТС]
Мне кажется , правильней будет вот так.
PHP
1
$rnd = mt_rand(0, $all-1);
Так как если в базе, скажем, 5 записей, и генератор выдаст число 5, то выборка данных не производится. Потому что, запись начинается с нуля, до четырех. А так, все отлично работает.:-)
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
04.01.2013, 15:30
да, так будет правильнее сначала так написал, а потом переписал по другому и забыл вычесть 1..
1
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
05.01.2013, 17:20  [ТС]
Кому может понадобится... Написал дополнительно скрипт, который предотвращает генерацию одинаковых чисел.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$all = mysql_num_rows(mysql_query("SELECT `id` FROM `base_1`")); //  количество записей
    $rtmp = array(); 
    $i = 0;
    $count = 4; // количество записей, выводимых на страницу
    $break = $count;
        while($i++<$count) {
            if($i<=$break) {
            $frand = mt_rand(0, $all-1);
                if(in_array($frand, $rtmp)) {
                    $i=$i-1; // если находим в массиве одинаковое число, добавляем еще один проход
                } else {
                    $rtmp[] = $frand; // добавляем число в массив
                    $get_name = mysql_fetch_assoc(mysql_query("SELECT `name` FROM `base_1` LIMIT ".$frand.", 1")); // производим выборку с позиции $frand
                    echo $get_name['name']."<br>"; // выводим данные
        }
    } else { break; }   // если количество превысило, выходим из цикла
}
Добавлено через 23 часа 17 минут
И еще один вопрос возник..

В этой теме, мы рассмотрели вывод данных на основе случайных чисел, но без каких-либо критериев на выборку(убрали WHERE). А как вывести таким же случайным образом данные из таблицы, но уже по определенным критериям? Скажем, у нас в таблице, дополнительно имеется столбец "login". И мне надо выбрать все данные с логином "stashappy" и случайным образом вывести на страницу, любые 5 из них.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
05.01.2013, 17:30
тоже самое, только добавить это самое условие WHERE перед лимитом

Добавлено через 23 секунды

Не по теме:

а у вас есть одинаковые логины? O_o

1
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
05.01.2013, 23:06  [ТС]

Не по теме:

а у вас есть одинаковые логины?
Одинаковых нет.:-)))))



Добавлено через 44 минуты
тоже самое, только добавить это самое условие WHERE перед лимитом
По идее да.. Но я забыл упомянуть еще один момент. Проще будет если я опишу свою ситуацию.

У меня имеется отдельная таблица с фотографиями пользователей. И таблица, с данными пользователя.
И получается так, что мне надо пробежаться сначала по таблице с фотографиями, найти там все записи c id выбранного пользователя и уж затем, обратиться к таблице с данными, чтобы вывести на страницу не только фото, но и соответственно его данные, да еще и случайным образом и определенное количество.

Я было нашел решение, но оно оказалось далеко не эффективным. Пример:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$us = $_REQUEST['user']; // user_id - получаем из url
$get_id = mysql_query("SELECT `id` FROM `base_foto` WHERE `user_id`='$us'");
 
$array_id = array();
while($result_id = mysql_fetch_assoc($get_id)) { // добавляем в массив все имеющиеся id
    $array_id[] = trim($result_id['id']);
}
suffle($array_id); // перемешиваем массив
for($i=0; $i<=5;$i++) { // выводим 5 записей на страницу
    $garray = $array_id[$i];
    $result_get = mysql_fetch_array(mysql_query("SELECT `name` FROM `base_users` WHERE `id`='$garray'"));
    $result_foto_url = mysql_fetch_array(mysql_query("SELECT `link_foto` FROM `base_foto` WHERE `id`='$garray'"));
    
    echo "<img src='".$result_foto_url['link_foto']."'>";
    echo "<h3>".$result_get['name']."</h3>";
}
Недостаток данного метода в том, что если в базе будет огромное количество записей, наш первый цикл в этом коде, затянется на долгое время.. Вот такая вот задачка...

Добавлено через 4 часа 48 минут
В принципе есть вариант. Вроде работает неплохо.
Код(записываем в массив 5 случайно выбранных id):
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$us = $_REQUEST['user']; // user_id - получаем из url
$all = mysql_num_rows(mysql_query("SELECT `id` FROM `base_photo` WHERE `user_ud`='$us'"));
$i=0;
$count = 5; // количество выводимых записей на страницу
$array_fr = array();
$rtmp = array();
while($i++<$count) {
if($i<=$all) {
$rnd =  mt_rand(0, $all-1);
    if(!in_array($rnd, $rtmp)) {
        $rtmp[] = $rnd;
                $result_get = mysql_fetch_array(mysql_query("SELECT `id` FROM `base_photo` WHERE `user_id`='$us' LIMIT ".$rnd.", 1"));          
                    if($result_get['id']!=NULL) {
                        $array_fr[] = $result_get['id'];
                    }
    } else {
        $i=$i-1;
    }
} else { break;  }
}
shuffle($array_fr); // перемешиваем массив
И далее уже с полученным массивом, через цикл выводим фото на страницу, а также остальные необходимые данные пользователя.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.01.2013, 23:06
Помогаю со студенческими работами здесь

Удалить пустые строки таблице DBF
Доброго всем времени суток! Сейчас разрабатываю программу для заполнения основной учебной базы, и одни человек с форума реализовал часть...

Как в таблице выбрать записи, строки которых пустые?
Как в таблице выбрать записи, строки которой пустые mysql_query(&quot;select * from `table` where `stroka` like ????????? &quot;);

Почему при импорте тхт-файлов в таблице только пустые строки?
Вот пример исходника: DoCmd.TransferText acImportDelim, 'Valuables - спецификация импорта', 'Temp_val', f1чего не так?

Фильтрация данных в ADOQuery выводит пустые строки
Как сделать фильтрацию данных в ADOQuery пишу такое выводит пустые строки... ADOQuery.Filtered:=true; ADOQuery.Filter:='Class =...

При выводе данных из БД в ListBox появляются пустые строки
У меня такая проблема: при выводе данных из бд в listbox появляются пустые строки cmd.Connection = coon; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru