Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Помогите с запросом, полинтернета перерыл, не могу найти ответа. Есть таблица news в ней есть поле id_news. И есть таблица comment_news в ней есть поля id_cnews и id_news. Вопрос - как сделать выборку данных из первой таблице - например 10 записей - по количеству комментариев к новостям?
Неактивен
Приложите пожалуйста дампы таблиц и пример выборки (результата), которую Вы хотите получить.
Неактивен
Честно, не знаю что такое дамб. В таблице news следующие поля: id_news data_publ id_serials title content image . В таблице comment_news - id_cnews id_otpr id_news data_publ content. Мне нужно получить выборку из 10 новостей, сортированных по количеству комментариев (то есть, на 1 странице - новости с 1 по 10, на 2 - с 11 по 20 и т.д.) В случае с сортировкой по дате добавления, у меня такой запрос: $query="SELECT * FROM `news` WHERE `id_news` = '$idnews' ORDER BY `data_publ` DESC LIMIT $start_page,10"; $conn -> query($query); где $star_page - начальная позиция выборки. Ну и далее обработка результата
Неактивен
Дамба - это скорее что-то на реке . Дамп - это структура таблиц и данные в них.
Например что-то такое, только Ваши таблицы и данные
Неактивен
А, понятно про дамб) Нет, в итоге у меня выводятся все новости, сортируясь с 1. Просто, я делаю свой первый сайт, поэтому многому учусь на ходу, и вот этот вопрос поставил меня в тупик(
Неактивен
Приложите всё же дамп Ваших таблиц пожалуйста. В запросе я немного ошибся, вот так попробуйте.
Отредактированно deadka (21.10.2011 00:16:18)
Неактивен
Теперь выводятся и сортируются новости правильно, но только те, к которым есть комментарии, а нельзя сделать вывод всех новостей (просто, мне кажется это логичнее и не придется править постраничную навигацию). А дамп, я хотя синтаксис sql запросов и знаю более менее, но создавал таблице в пхпмайадмин, можно в нем посмотреть дамп?
Неактивен
Можно, нужно пройти в раздел export. Точнее не скажу, под рукой phpmyadmin'a у меня нету.
Вывести все новости можно конечно, но в каком виде Вы хотите их получить? По какому параметру Вы их хотите отсортировать? Как-то так
Отредактированно deadka (21.10.2011 00:25:05)
Неактивен
Вот дампы:
CREATE TABLE IF NOT EXISTS `comment_news` (
`id_cnews` int(10) unsigned NOT NULL AUTO_INCREMENT,
`id_otpr` int(10) unsigned NOT NULL,
`id_news` int(10) unsigned NOT NULL,
`data_publ` datetime NOT NULL,
`content` text NOT NULL,
PRIMARY KEY (`id_cnews`),
KEY `id_otpr` (`id_otpr`,`data_publ`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=13 ;
CREATE TABLE IF NOT EXISTS `news` (
`id_news` int(10) unsigned NOT NULL AUTO_INCREMENT,
`data_publ` datetime NOT NULL,
`id_serials` int(10) unsigned DEFAULT NULL,
`title` varchar(100) NOT NULL,
`content` text NOT NULL,
`image` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id_news`),
KEY `data_publ` (`data_publ`,`id_serials`,`title`,`content`(200))
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=22 ;
Индексы я еще буду редактировать. Мне на самом деле главное понять смысл, как вообще делать такой запрос - выводить данные из 1 таблицы, сортируя по значениям в другой таблице. Потому что будет несколько разделов, в которых будет на выбор посетителя сортировка или по дате добавления, или по количеству комментариев, средней оценки, и т.д. (для разных разделов сортировка по дате и вторая по другому критерию).
Неактивен
Отлично, мы уже получили структуру, остались сами данные . Поставьте галочку соответствующую, чтобы данные тоже скопировались. Ответьте плиз на мои неотвеченные вопросы в предыдущем посте, в частности выполняет ли нужную Вам выборку предыдущий запрос.
Неактивен
Поскольку, я пока только делаю сайт, и он у меня первый, то данные на самом деле - это бессвязный тест, вот он:
INSERT INTO `comment_news` (`id_cnews`, `id_otpr`, `id_news`, `data_publ`, `content`) VALUES
(1, 22, 21, '2011-11-21 10:10:10', 'тест тест тест'),
(2, 22, 21, '2011-10-20 18:56:29', 'проверка намбер ван'),
(3, 22, 21, '2011-10-20 18:56:38', '0'),
(4, 22, 21, '2011-10-20 18:56:42', '0'),
(5, 22, 21, '2011-10-20 18:56:44', '0'),
(6, 22, 21, '2011-10-20 18:56:48', '0'),
(7, 22, 21, '2011-10-20 18:56:51', '0'),
(8, 22, 21, '2011-10-20 18:56:59', '0'),
(9, 22, 21, '2011-10-20 18:57:02', '0'),
(10, 22, 21, '2011-10-20 18:57:06', '0'),
(11, 22, 21, '2011-10-20 18:57:10', '0'),
(12, 22, 17, '2011-10-20 20:39:35', 'sdfg');
INSERT INTO `news` (`id_news`, `data_publ`, `id_serials`, `title`, `content`, `image`) VALUES
(1, '2011-10-08 00:00:00', 2, 'проо', 'пароп', '/images/news/1.gif'),
(2, '2011-10-08 00:00:00', 1, 'проо', 'пароп', ''),
(3, '2011-10-08 04:47:45', 2, 'проо', 'пароп', ''),
(4, '2011-10-08 07:10:11', 2, 'Привет, текстовая новость', 'тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест', '/images/news/4.gif'),
(5, '2011-10-08 07:11:28', 2, 'Привет, текстовая новость', 'тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест', '/images/news/5.gif'),
(6, '2011-10-08 08:54:55', 2, 'Привет, текстовая новость', 'тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест, тест', '/images/news/6.gif'),
(7, '2011-10-10 03:49:19', 1, 'ntcnj', 'fjghfklghlhgtuiogh', ''),
(8, '2011-10-12 06:22:12', 2, 'fhghhj', 'ghjhjgh', ''),
(9, '2011-10-12 06:22:16', 2, 'fhghhj', 'ghjhjgh', ''),
(10, '2011-10-12 06:22:20', 2, 'fhghhj', 'ghjhjgh', ''),
(11, '2011-10-12 06:22:24', 1, 'fhghhj', 'ghjhjgh', ''),
(12, '2011-10-12 06:22:42', 0, 'fhghhj', 'ghjhjgh', ''),
(13, '2011-10-12 06:46:53', 0, 'gfhhjg', 'ghhghgfhg', ''),
(14, '2011-10-12 06:46:56', 0, 'gfhhjg', 'ghhghgfhg', ''),
(15, '2011-10-12 06:47:00', 0, 'gfhhjg', 'ghhghgfhg', ''),
(16, '2011-10-12 06:47:04', 0, 'gfhhjg', 'ghhghgfhg', ''),
(17, '2011-10-12 06:47:08', 0, 'gfhhjg', 'ghhghgfhg', ''),
(18, '2011-10-12 06:47:19', 0, 'gfhhjg', 'ghhghgfhg', ''),
(19, '2011-10-12 06:47:24', 0, 'gfhhjg', 'ghhghgfhg', ''),
(20, '2011-10-14 21:52:13', 0, 'gfhhjg', 'hjhj', '/images/news/20.jpg'),
(21, '2011-10-14 21:53:48', 0, 'gfhhjg', 'hjhj', '/images/news/21.jpg');
Неактивен
Пусть безсвязные, это неважно в данном случае .
Ответьте плиз на мои неотвеченные вопросы в предыдущем посте, в частности выполняет ли нужную Вам выборку предыдущий запрос.
Неактивен
Предыдущий запрос - выводит все новости на страницу, сортируя их по количеству комментариев, у новостей без комментариев - по возрастанию ай ди. Мне нужно, что при выборе пользователям сортировки по обсуждаемости, выводились первые 10 новостей и ссылки на обсуждения, снизу постраничная навигация. Скрипт с отображением и добавлением комментариев написан, постраничная навигация - тоже.
Неактивен
Можете прокомментировать запрос свой? Я так его понял:
select n.* from news n - выбираем все столбцы из таблицы ньюс (н это я так понимаю псевдоним? Зачем он нужен здесь тогда и почему между ньюс и н нету ас?
left join (select id_news,count(id_cnews) as c from comment_news group by id_news - левостороннее объединение, то есть выбираем все записи из таблицы ньюс и по возможности дополняем их количеством комментариев к новости, делаем псевдоним для этого ц. Зачем мы здесь же выбираем айди_ньюс?
order by 2 desc) s - эта часть непонятна, зачем здесь сортировка?
on n.id_news=s.id_news order by c desc - в принципе понятно
Неактивен
да, n - это псевдоним. нужен для краткости, в-общем-то он необязателен.
as писать тоже необязательно.
> Зачем мы здесь же выбираем айди_ньюс?
для того, чтобы произвести связку таблиц ( on n.id_news=s.id_news ) по полю id_news.
сортировка для того, чтобы вывести сначала самые комментируемые новости.
Внутренняя сортировка при наличии внешней действительно не нужна.
Отредактированно deadka (21.10.2011 00:57:00)
Неактивен
>Мне нужно, что при выборе пользователям сортировки по обсуждаемости, выводились первые 10 новостей и ссылки на >обсуждения.
Где взять ссылки на обсуждение - тут уже Вам виднее.
Вот этот запрос
Неактивен
Как выводить разные новости для разных страниц я уже придумал, как я и сказал, раздел новостей готов у меня на 90%, проблема только в сортировки по обсуждаемости. Теперь благодаря вашей помощи большая часть понятна (мне нужен был не столько готовый скрипт, сколько сама логика построения запроса чтоли, понимания что именно мне нужно писать в запрос, а в остальном интернет и смекалка помогут)). Непонятно, что значит ifnull(s.c,0)
Неактивен
Надеюсь, идею я сумел донести . функция ifnull преобразует null в то, во что Вы захотите - в данном случае 0.
В левостороннем объединении те поля подчиненной (правой) таблице, на которые не срабатывает условие on выводятся как NULL, а это не всегда хорошо.
Попробуйте заменить в запросе ifnull(s.c,0) на s.c и посмотрите на отличие.
Отредактированно deadka (21.10.2011 01:13:24)
Неактивен
Да, идею донесли, за что огромное спасибо) Пока мозг не очень работает после долгих бессонных часов скитаний по интернету. Завтра на свежую голову все еще подробнее изучу. Надеюсь все будет понятно, если что-то не понятно - то спрошу, с надеждой на ответ) Ибо лучше сразу, на примере этого запроса все понять, и когда буду делать остальные разделы уже не приходилось снова что-то искать, спрашивать)
Неактивен
Пожалуйста, обращайтесь . После составления запроса неплохо бы подумать и про его оптимизацию - здесь явно просится ключик
Неактивен
Страниц: 1