Jump to content
  • 0

php скрипт выдергивания данных из mysql


li4e
 Share

Question

Добрый день. Очень нужно написать небольшой скрипт для своего проектика, но в php ноль, и вообще пока изучаю только frontend разработку, Заранее спасибо.

Нужно выдернуть значение из таблицы "mt_entry" из столбца "entry_text" и из рандомной строки с условием что в ячейке столбца "entry_blog_id" находится значение равное "6". Заранее спасибо, прошу помочь кому не сложно!

Edited by li4e
Link to comment
Share on other sites

13 answers to this question

Recommended Posts

  • 0

Мало информации. Ключевое поле id, есть? что обозначает столбец entry_blog_id... номер блога?

Я бы сначала выбрал все ID из строк, где поле entry_blog_id == 6, затем запускал рандом в массив с ID, и уже затем отправлял окончательный запрос

Link to comment
Share on other sites

  • 0

Как-то так:


<?php
$server = "server_address";
$db_user = "username";
$db_pass = "password";
$db_name = "database_name";

mysql_connect($server, $db_user, $db_pass) or die("Невозможно соединиться с базой данных.");
mysql_select_db($db_name);
$result = mysql_query("SELECT entry_text FROM `mt_entry` WHERE entry_blog_id = 6 ORDER BY RAND() LIMIT 1");
$row = mysql_fetch_array($result);
if($row['entry_text']){
echo $row['entry_text'];
} else {
echo "Совпадений не найдено";
}

?>

Link to comment
Share on other sites

  • 0

=) на днях я понял какое важное значение играет оптимизация (в результате одного сложного запроса на пол часа сервер нагнул, с блокировкой таблиц, поэтому стараюсь искать решения, для наименьшего обращения к жесткому диску)

лучше как то так

$row_count = mysql_query(" SELECT COUNT(*) FROM `mt_entry` WHERE `entry_blog_id` = ' 6' ");

вычислим произвольное число от 0 до кол-ва записей в этой таблице

$rand_row
=
rand
(
0
,
$row_count

)
;

Теперь без проблем можно сделать выборку произвольной записи:

$result

=
mysql_query(
"
SELECT
entry_text
FROM `
mt_entry`
WHERE
`
entry_blog_id` = ' 6'
LIMIT
"
.
$rand_row
.
"
, 1
"
);

Я почему и спрашивал) если в столбце entry_text немного значений с одинаковой цифрой, тогда любой вариант подойдёт) если тысячи, тогда нужно оптимизировать...

Не тестировал, но вроде правильно написал

upd: нужно что то делать с редактированием записей на форуме - который раз весь код разметки наружу выскочил

Edited by Николя223
  • Like 1
Link to comment
Share on other sites

  • 0

Если на моём примере, то нужно запрос изменить:


$result = mysql_query("SELECT entry_text, entry_title FROM `mt_entry` WHERE entry_blog_id = 6 ORDER BY RAND() LIMIT 1");

Значение будет храниться в $row['entry_title'].

Link to comment
Share on other sites

  • 0
я понял какое важное значение играет оптимизация

$row_count = mysql_query(" SELECT COUNT(*) FROM `mt_entry` WHERE `entry_blog_id` = ' 6' ");

Ты уверен, что понял?

если тысячи, тогда нужно оптимизировать...

и сколько надо тысяч, чтобы начать оптимизировать?

Edited by keltanas
Link to comment
Share on other sites

  • 0

.

и сколько надо тысяч, чтобы начать оптимизировать?

А ты проверял? Есть боевой пример. таблица базы данных 1.7 Гигабайт!!!! В ней более 60 000 000 строк - так исторически сложилось.

запрос

"SELECT * FROM `forum_search_matches` LIMIT 18700000 , 1"

отработал за 4 секунды ещё ряд тестов - среднее время 1.2 секунды

Согласен, много. Но нужно учесть, что БД не помещаеться целиком в оперативную память . боюсь представить что будет если сделаю order by rand,

не думаю что айс

По подсчетам - Лимит не подходит если выборка после 900000 элемента.

А если у сайта много посетителей, лучше вообще отказаться и искать другие пути

А теперь представим что произойдет если использовать ORDER BY RAND()?

Сервер перелопатит Всю почти двухгигабайтную таблицу пересортирует её, сохранит на жесткий (так как в ОЗУ не поместиться) и отдаст.

Вывод? лучше подождать немного

Если не так, то прошу аргументировать)

"SELECT * FROM `forum_search_matches` LIMIT 54000000 , 1"

А вот это ещё жестче, ждал 30 секунд. Сервер отказался выдавать результат

И добавлю))) Там что то писалось о 900000 ...

"SELECT * FROM `forum_search_matches` LIMIT 900000,1"

отработал за 0.0639851093292 секунд =)

мерил с помощью разности Финишного и начального дампа времени. microtime()

Edited by Николя223
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy