[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Оптимальный алгоритм работы с базой
KonstRuctor
Все привет!
Есть вывод новостей, у каждой новости может быть несколько авторов. Задача - вывести новости на странице и сделать это оптимально.
Есть три таблицы:
1) news - новости
id | date | title | text

2) authors - авторы
id | name | email

3) news_authors - кто что написал
id_news | id_author

Сейчас я делаю вывод так:
$q = mysql_query("SELECT * FROM `news` ORDER BY `date` DESC LIMIT 10");
while ( $data = mysql_fetch_assoc($q) )
{
echo "<h1>".$data['title']."</h1>\n";
echo "<p>\n";
$q1 = mysql_query("
SELECT a.name
FROM authors a, news_authors b
WHERE a.id = b.id_author
AND b.id_news = '"
.$data['id']."'
"
);
while ( $row = mysql_fetch_assoc($q1) )
{
echo $row['name'].", "; // как обрезать последнюю запятую понятно, не суть
}
echo "</p>\n";
echo "<p>".$data["text"]."</p>\n";
echo "<hr>\n";
}

Вопросы к уважаемым коллегам:
1) Возможно ли сделать подобную выборку одним запросом, не делая запрос авторов в цикле?
2) Если все же как-то возможно, даст ли это прирост в производительности?
P.S. Сейчас могу привести скорость выполнения скрипта БЕЗ авторов вообще и с авторами (0,05 - 0,13) данные все время меняются по кнопке Ф5, но в среднем вот так (CodeIgniter, хостер nic.ru)
Спасибо!



Спустя 9 минут, 30 секунд (17.02.2012 - 16:54) caballero написал(а):
выгреби отдельно новости обычным способом а отдельно авторов (по выбранным новостям) одним запросом в массив и вынимай оттуда для каждой новости

Спустя 1 минута, 28 секунд (17.02.2012 - 16:55) nugle написал(а):
KonstRuctor
1) да
2) Да, так как дергать бд в цикле - не есть хорошо, гораздо быстрее сформировать все одним запросом, а потом делать вывод
Собираешь все необходимые данные в переменные в переменные, через запятую, потом делаешь where `row` in().
Обрезать с помощью trim($var, ',');

Спустя 12 минут, 31 секунда (17.02.2012 - 17:08) KonstRuctor написал(а):
Я понимаю, что вызывать запрос в цикле не есть хорошо, поэтому и задал вопрос :-)
Однако совершенно не понимаю синтаксис кода, который мне надо кодировать....
Был бы очень раз увидеть код, если это возможно.
Или ссылку на статью, где можно увидеть подобный пример. Спасибо!

Спустя 9 минут, 8 секунд (17.02.2012 - 17:17) nugle написал(а):
Вроде этого
while ( $data = mysql_fetch_assoc($q) )
{
$data_id = '"'.$data['id'].'",';
}
$data_id = trim($data_id, ',');
$q1 = mysql_query("
SELECT a.name
FROM authors a, news_authors b
WHERE a.id = b.id_author
AND b.id_news in('.
$data_id.')
"
);

Спустя 2 минуты, 14 секунд (17.02.2012 - 17:19) caballero написал(а):
а зачем собирать через запятую если можно просто подзапрос включить

Спустя 2 минуты, 23 секунды (17.02.2012 - 17:22) nugle написал(а):
caballero
я привожу примеры, которые знаю, а не на бум) Ты бы лучше свой вариант кинул)

Спустя 5 минут, 30 секунд (17.02.2012 - 17:27) caballero написал(а):
Я написал какой вариант. Если в твое "знаю" не входит знание подзапросов в SQL это не мои проблеммы.

Спустя 35 минут, 27 секунд (17.02.2012 - 18:03) nugle написал(а):
Цитата
не входит знание подзапросов в SQL это не мои проблеммы

А я тебя и не обвиняю, я говорю, что привел пример, который знал

Спустя 4 часа, 15 минут, 51 секунда (17.02.2012 - 22:19) KonstRuctor написал(а):
Прошу прощения за мою тупость, но я совсем ничего не понимаю.
Друзья, совершенно не обижусь, если закроем тему, так как, похоже, вопрос элементарный, а я просто не въезжаю в него.

Смотрите, вот вы пишите:
while ( $data = mysql_fetch_assoc($q) )
{
$data_id = '"'.$data['id'].'",';
}

я делаю print_r($data_id); получаю "1",
Или надо делать
 $data_id[] = '"'.$data['id'].'",';

Тогда я делаю print_r($data_id); и получаю массив
Array
(
[0] => "6",
[1] => "5",
[2] => "4",
[3] => "3",
[4] => "2",
[5] => "1",
)

А как написать вывод новостей-то с авторами, чтобы получить на выходе
------------------------------------------
Заголовок шестой новости

Абдула Фатхуддинов, Вася Иванов, Саша Сидоров,

Phasellus rhoncus ipsum ac massa aliquam egestas? Aenean ullamcorper tempus lorem, a iaculis libero lobortis non. Pellentesque blandit nulla sed est luctus bibendum. Sed molestie; nisl ac iaculis scelerisque, mi nisi ultrices ligula, ac vulputate
-------------------------------------------
Заголовок пятой новости

Вася Иванов, Маша Петрова,

Phasellus rhoncus ipsum ac massa aliquam egestas? Aenean ullamcorper tempus lorem, a iaculis libero lobortis non. Pellentesque blandit nulla sed est luctus bibendum. Sed molestie; nisl ac iaculis scelerisque, mi nisi ultrices ligula, ac vulputate
----------------------------------------------
* * *
По поводу получить все сразу одним запросом -- я уже давно бьюсь с этой темой, спрашивал у многих людей. Мне все говорят, что да, можно сделать один запрос. Но никто на полгода так и не написал такой запрос. Мистика какая-то.
* * *
Дамп базы прикладываю для примера

Спустя 40 минут, 38 секунд (17.02.2012 - 22:59) nugle написал(а):
KonstRuctor
i'm sorry)
вместо
$data_id = '"'.$data['id'].'",';
вот так
$data_id .= '"'.$data['id'].'",';
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.