SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 20.10.2011 23:37:38

angelmax
Участник
Зарегистрирован: 20.10.2011
Сообщений: 20

Сортировка данных из 1 таблицы по данным в другой таблице

Помогите с запросом, полинтернета перерыл, не могу найти ответа. Есть таблица news в ней есть поле id_news. И есть таблица comment_news в ней есть поля id_cnews и id_news. Вопрос - как сделать выборку данных из первой таблице - например 10 записей - по количеству комментариев к новостям?

Неактивен

 

#2 20.10.2011 23:54:23

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Сортировка данных из 1 таблицы по данным в другой таблице

Приложите пожалуйста дампы таблиц и пример выборки (результата), которую Вы хотите получить.

select n.* from news n left join (select id_news,count(id_cnews)  from comment_news group by id_news order by 2 desc limit 10) s on n.id_news=s.id_news


Оно?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 21.10.2011 00:03:29

angelmax
Участник
Зарегистрирован: 20.10.2011
Сообщений: 20

Re: Сортировка данных из 1 таблицы по данным в другой таблице

Честно, не знаю что такое дамб. В таблице 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 - начальная позиция выборки. Ну и далее обработка результата

Неактивен

 

#4 21.10.2011 00:06:22

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Сортировка данных из 1 таблицы по данным в другой таблице

Дамба - это скорее что-то на реке big_smile. Дамп - это структура таблиц и данные в них.
Например что-то такое, только Ваши таблицы и данные

CREATE TABLE `cats` (
  `id` int(2) NOT NULL AUTO_INCREMENT,
  `cat_title` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
insert  into `cats`(`id`,`cat_title`) values (1,'cat1'),(2,'cat2');

DROP TABLE IF EXISTS `news`;
CREATE TABLE `news` (
  `id` int(2) NOT NULL AUTO_INCREMENT,
  `cat_id` int(11) DEFAULT NULL,
  `title` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
insert  into `news`(`id`,`cat_id`,`title`) values (1,1,'news1'),(2,1,'news2'),(3,2,'new3'),(4,2,'new4'),(5,1,'new5'),(6,2,'new6');


Запрос, который я привел решил Вашу задачу (на первую страницу)?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 21.10.2011 00:10:39

angelmax
Участник
Зарегистрирован: 20.10.2011
Сообщений: 20

Re: Сортировка данных из 1 таблицы по данным в другой таблице

А, понятно про дамб) Нет, в итоге у меня выводятся все новости, сортируясь с 1. Просто, я делаю свой первый сайт, поэтому многому учусь на ходу, и вот этот вопрос поставил меня в тупик(

Неактивен

 

#6 21.10.2011 00:13:25

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Сортировка данных из 1 таблицы по данным в другой таблице

Приложите всё же  дамп Ваших таблиц пожалуйста. В запросе я немного ошибся, вот так попробуйте.

select n.*,c from news n inner join (select id_news,count(id_cnews) c  from comment_news group by id_news order by 2 desc limit 10) s on n.id_news=s.id_news order by c desc

Отредактированно deadka (21.10.2011 00:16:18)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 21.10.2011 00:19:23

angelmax
Участник
Зарегистрирован: 20.10.2011
Сообщений: 20

Re: Сортировка данных из 1 таблицы по данным в другой таблице

Теперь выводятся и сортируются новости правильно, но только те, к которым есть комментарии, а нельзя сделать вывод всех новостей (просто, мне кажется это логичнее и не придется править постраничную навигацию). А дамп, я хотя синтаксис sql запросов и знаю более менее, но создавал таблице в пхпмайадмин, можно в нем посмотреть дамп?

Неактивен

 

#8 21.10.2011 00:24:07

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Сортировка данных из 1 таблицы по данным в другой таблице

Можно, нужно пройти в раздел export. Точнее не скажу, под рукой phpmyadmin'a у меня нету.

Вывести все новости можно конечно, но в каком виде Вы хотите их получить? По какому параметру Вы их хотите отсортировать? Как-то так

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

?

Отредактированно deadka (21.10.2011 00:25:05)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#9 21.10.2011 00:31:35

angelmax
Участник
Зарегистрирован: 20.10.2011
Сообщений: 20

Re: Сортировка данных из 1 таблицы по данным в другой таблице

Вот дампы:

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 таблицы, сортируя по значениям в другой таблице. Потому что будет несколько разделов, в которых будет на выбор посетителя сортировка или по дате добавления, или по количеству комментариев, средней оценки, и т.д. (для разных разделов сортировка по дате и вторая по другому критерию).

Неактивен

 

#10 21.10.2011 00:33:31

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Сортировка данных из 1 таблицы по данным в другой таблице

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


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#11 21.10.2011 00:38:35

angelmax
Участник
Зарегистрирован: 20.10.2011
Сообщений: 20

Re: Сортировка данных из 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');

Неактивен

 

#12 21.10.2011 00:39:34

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Сортировка данных из 1 таблицы по данным в другой таблице

Пусть безсвязные, это неважно в данном случае smile.
Ответьте плиз на мои неотвеченные вопросы в предыдущем посте, в частности выполняет ли нужную Вам выборку предыдущий запрос.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#13 21.10.2011 00:41:17

angelmax
Участник
Зарегистрирован: 20.10.2011
Сообщений: 20

Re: Сортировка данных из 1 таблицы по данным в другой таблице

Предыдущий запрос - выводит все новости на страницу, сортируя их по количеству комментариев, у новостей без комментариев - по возрастанию ай ди. Мне нужно, что при выборе пользователям сортировки по обсуждаемости, выводились первые 10 новостей и ссылки на обсуждения, снизу постраничная навигация. Скрипт с отображением и добавлением комментариев написан, постраничная навигация - тоже.

Неактивен

 

#14 21.10.2011 00:52:42

angelmax
Участник
Зарегистрирован: 20.10.2011
Сообщений: 20

Re: Сортировка данных из 1 таблицы по данным в другой таблице

Можете прокомментировать запрос свой? Я так его понял:
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 - в принципе понятно

Неактивен

 

#15 21.10.2011 00:56:01

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Сортировка данных из 1 таблицы по данным в другой таблице

да, n - это псевдоним. нужен для краткости, в-общем-то он необязателен.
as писать тоже необязательно.

> Зачем мы здесь же выбираем айди_ньюс?
для того, чтобы произвести связку таблиц ( on n.id_news=s.id_news ) по полю id_news.
сортировка для того, чтобы вывести сначала самые комментируемые новости.
Внутренняя сортировка при наличии внешней действительно не нужна.

Отредактированно deadka (21.10.2011 00:57:00)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#16 21.10.2011 01:01:17

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Сортировка данных из 1 таблицы по данным в другой таблице

>Мне нужно, что при выборе пользователям сортировки по обсуждаемости, выводились первые 10 новостей и ссылки на >обсуждения.

Где взять ссылки на обсуждение - тут уже Вам виднее.

Вот этот запрос

select n.id_news,n.title,ifnull(s.c,0) from news n left join (select id_news,count(id_cnews) as c  from comment_news group by id_news) s on n.id_news=s.id_news order by c desc limit 10;


выводит первые десять (самые обсуждаемые статьи) - id новости, ее заголовок и количество комментариев.
Если нужные какие-то еще поля - добавьте их в select, если какие-то не нужны - соответственно уберите их.

Это подходит для первой страницы, для второй можно так:

select n.id_news,n.title,ifnull(s.c,0) from news n left join (select id_news,count(id_cnews) as c  from comment_news group by id_news) s on n.id_news=s.id_news order by c desc limit 10,10;


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#17 21.10.2011 01:08:29

angelmax
Участник
Зарегистрирован: 20.10.2011
Сообщений: 20

Re: Сортировка данных из 1 таблицы по данным в другой таблице

Как выводить разные новости для разных страниц я уже придумал, как я и сказал, раздел новостей готов у меня на 90%, проблема только в сортировки по обсуждаемости. Теперь благодаря вашей помощи большая часть понятна (мне нужен был не столько готовый скрипт, сколько сама логика построения запроса чтоли, понимания что именно мне нужно писать в запрос, а в остальном интернет и смекалка помогут)). Непонятно, что значит ifnull(s.c,0)

Неактивен

 

#18 21.10.2011 01:11:34

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Сортировка данных из 1 таблицы по данным в другой таблице

Надеюсь, идею я сумел донести smile. функция ifnull преобразует null в то, во что Вы захотите - в данном случае 0.
В левостороннем объединении те поля подчиненной (правой) таблице, на которые не срабатывает условие on выводятся как NULL, а это не всегда хорошо.
Попробуйте заменить в запросе ifnull(s.c,0) на s.c  и посмотрите на отличие.

Отредактированно deadka (21.10.2011 01:13:24)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#19 21.10.2011 01:19:42

angelmax
Участник
Зарегистрирован: 20.10.2011
Сообщений: 20

Re: Сортировка данных из 1 таблицы по данным в другой таблице

Да, идею донесли, за что огромное спасибо) Пока мозг не очень работает после долгих бессонных часов скитаний по интернету. Завтра на свежую голову все еще подробнее изучу. Надеюсь все будет понятно, если что-то не понятно - то спрошу, с надеждой на ответ) Ибо лучше сразу, на примере этого запроса все понять, и когда буду делать остальные разделы уже не приходилось снова что-то искать, спрашивать)

Неактивен

 

#20 21.10.2011 01:26:38

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Сортировка данных из 1 таблицы по данным в другой таблице

Пожалуйста, обращайтесь smile. После составления запроса неплохо бы подумать и про его оптимизацию - здесь явно просится ключик

alter table comment_news add key id_news__id_cnews(id_news,id_cnews);


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson