Есть вывод новостей, у каждой новости может быть несколько авторов. Задача - вывести новости на странице и сделать это оптимально.
Есть три таблицы:
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, ',');
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 написал(а):
Прошу прощения за мою тупость, но я совсем ничего не понимаю.
Друзья, совершенно не обижусь, если закроем тему, так как, похоже, вопрос элементарный, а я просто не въезжаю в него.
Смотрите, вот вы пишите:
я делаю print_r($data_id); получаю "1",
Или надо делать
Тогда я делаю print_r($data_id); и получаю массив
А как написать вывод новостей-то с авторами, чтобы получить на выходе
------------------------------------------
Заголовок шестой новости
Абдула Фатхуддинов, Вася Иванов, Саша Сидоров,
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
----------------------------------------------
* * *
По поводу получить все сразу одним запросом -- я уже давно бьюсь с этой темой, спрашивал у многих людей. Мне все говорят, что да, можно сделать один запрос. Но никто на полгода так и не написал такой запрос. Мистика какая-то.
* * *
Дамп базы прикладываю для примера
Друзья, совершенно не обижусь, если закроем тему, так как, похоже, вопрос элементарный, а я просто не въезжаю в него.
Смотрите, вот вы пишите:
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'].'",';
i'm sorry)
вместо
$data_id = '"'.$data['id'].'",';
вот так
$data_id .= '"'.$data['id'].'",';