Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / MySQL Новый топик    Ответить
 Простой запрос на выборку и подсчёт  [new]
Gamletus
Member

Откуда:
Сообщений: 40
Здравствуйте. Прощу помочь в формировании простого запроса, который отобразит последние 10 комментариев, при этом покажет кто именно оставил комментарий, покажет сам текст комментария и количество сколько всего оставил комментариев тот или иной пользователь.
Т.е. есть таблица
1 - Паша - Текст1
2 - Вася - Текст2
3 - Сергей - Текст3
4 - Никита - Текст4
5 - Паша - Текст5
6 - Паша - Текст6
....
N - Юзер Коммент N


Должно вывести:
Паша - 3 коммента - Текст6
Паша - 3 коммента - Текст5
Никита - 1 коммента - Текст4
Сергей - 1 коммента - текст3
Вася - 1 коммент - текст2
Паша - 3 коммента - текст1
......
10 ноя 15, 18:51    [18396686]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос на выборку и подсчёт  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 18190
Gamletus
последние 10 комментариев

Последние по какому критерию?
А вообще
ORDER BY критерий DESC LIMIT 1
10 ноя 15, 19:00    [18396748]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос на выборку и подсчёт  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 18190
Пардон, LIMIT 10
10 ноя 15, 19:00    [18396749]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос на выборку и подсчёт  [new]
Gamletus
Member

Откуда:
Сообщений: 40
Akina, ну последние по айдишнику. Тут мне важно запрос на отображение и подсчёт, чтобы всё в одном запросе, а то я как дурак через цикл в пхп делаю.
10 ноя 15, 19:02    [18396760]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос на выборку и подсчёт  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 18190
Ты хочешь в одном запросе получить данные разных уровней группировки. Без подзапроса (на получение количества комментов) не получится.
10 ноя 15, 19:08    [18396782]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос на выборку и подсчёт  [new]
Gamletus
Member

Откуда:
Сообщений: 40
Akina, пусть с подзапросами, но это явно лучше, чем сейчас у меня )))
10 ноя 15, 19:23    [18396862]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос на выборку и подсчёт  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 18190
Gamletus
это явно лучше, чем сейчас у меня

Сейчас у тебя, если верить тому, что ты тут пишешь - вообще ничего.
Покажи хотя бы DDL таблицы. Ещё лучше - плюс тестовое наполнение. Совсем хорошо - если в форме работающих SQL-скриптов. Ну и, конечно, желаемый на этом наполнении результат.
10 ноя 15, 20:53    [18397153]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос на выборку и подсчёт  [new]
Gamletus
Member

Откуда:
Сообщений: 40
Akina, не думал, что мой вопрос будет настолько сложным, что у тебя возникнет ещё куча вопросов.
Создаём таблицу:
CREATE TABLE IF NOT EXISTS `table` (
  `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(250) NOT NULL,
  `comment` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


Создаём комментарии:
INSERT INTO `table` (`id`, `name`, `comment`) VALUES
(1, 'Паша', 'коментарий'),
(2, 'Сергей', 'коментарий'),
(3, 'Максим', 'коментарий'),
(4, 'Коля', 'коментарий'),
(5, 'Паша', 'коментарий'),
(6, 'Паша', 'коментарий'),
(7, 'Паша', 'коментарий'),
(8, 'Паша', 'коментарий'),
(9, 'Паша', 'коментарий');


Результат как в первом сообщении...
10 ноя 15, 23:34    [18397591]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос на выборку и подсчёт  [new]
tanglir
Member

Откуда:
Сообщений: 28966
Gamletus
и количество сколько всего оставил комментариев тот или иной пользователь.
количество из этих десяти или из всей таблицы?
11 ноя 15, 07:27    [18398062]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос на выборку и подсчёт  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 18190
select t1.name,
       concat(sq.cnt,' комментариев'),
       t1.comment
from `table` t1,
     ( select t2.name, count(t2.id) cnt
       from `table` t2
       group by t2.name
     ) sq
where t1.name=sq.name
order by t1.id desc;
11 ноя 15, 09:25    [18398349]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос на выборку и подсчёт  [new]
Gamletus
Member

Откуда:
Сообщений: 40
Спасибо за ответы, не думайте что я забил на тему. Просто пытался сам чуток разобраться. Что-то не выходит. При большом количестве записей просто виснет. Решил немного точнее вопрос сформулировать и добавить столбец.

Запрос на создание таблицы:
CREATE TABLE IF NOT EXISTS `table` (
  `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  `user` varchar(250) NOT NULL,
  `manager` varchar(250) NOT NULL,
  `comment` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

Запрос на добавление строк:
INSERT INTO `table` (`id`, `user`, `manager`, `comment`) VALUES
(1, 'Паша', 'М1', 'коментарий'),
(2, 'Сергей', 'М1', 'коментарий'),
(3, 'Максим', 'М1', 'коментарий'),
(4, 'Коля', 'М3', 'коментарий'),
(5, 'Паша', 'М2', 'коментарий'),
(6, 'Паша', 'М8', 'коментарий'),
(7, 'Паша', 'М3', 'коментарий'),
(8, 'Марина', 'М1', 'коментарий'),
(9, 'Паша', 'М5', 'коментарий'),
(10, 'Сергей', 'М5', 'коментарий'),
(11, 'Максим', 'М5', 'коментарий'),
(12, 'Света', 'М1', 'коментарий'),
(13, 'Света', 'М7', 'коментарий'),
(14, 'Света', 'М3', 'коментарий'),
(15, 'Света', 'М2', 'коментарий'),
(16, 'Коля', 'М1', 'коментарий'),
(17, 'Витя', 'М1', 'коментарий'),
(18, 'Никита', 'М1', 'коментарий'),
(19, 'Денис', 'М1', 'коментарий'),
(20, 'Лена', 'М1', 'коментарий'),
(21, 'Лена', 'М2', 'коментарий'),
(22, 'Катя', 'М1', 'коментарий'),
(23, 'Катя', 'М2', 'коментарий'),
(24, 'Катя', 'М4', 'коментарий'),
(25, 'Женя', 'М5', 'коментарий'),
(25, 'Женя', 'М1', 'коментарий');

Важно замечание!! Строк примерно 13.000 штук и будет больше.

Суть заключается в том, что каждый пользователь оставляет отзыв про менеджера и требуется вывести самые свежие 10 комментаторов для менеджера "М1"
Но для каждой записи необходимо сделать отображение сколько всего отзывов оставил тот или иной комментатор, не конкретно про данного менеджера, а вообще сколько всего. Т.е. по идее результат должен быть таким:
1. Женя (2)
2. Катя (3)
3. Лена (2)
4. Денис (1)
5. Никита (1)
6. Витя (1)
7. Коля (1)
8. Света (4)
9. Марина (1)
10. Максим (1)


Вроде ничего не забыл. Прошу помочь составить запрос, который смог бы это отобразить и желательно, чтобы запрос работал с большим количеством записей.
21 ноя 15, 23:23    [18453711]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос на выборку и подсчёт  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 18190
Gamletus
требуется вывести самые свежие 10 комментаторов для менеджера "М1"

В структуре отсутствует поле, которое устанавливает порядок очерёдности записей (вероятно, это должен быть штамп времени комментария). ID на эту роль подходит формально, но не идеологически.
Впрочем, если всё-таки предположить, что именно это поле определяет порядок - шаблон я уже дал. Правда, тут ты упрёшься в о, что в подзапросе нельзя использовать LIMIT. Но если подзапрос с LIMIT оформить как вьюв - то всё получится как нужно.
22 ноя 15, 13:15    [18455128]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос на выборку и подсчёт  [new]
*
Guest
автор
10. Максим (1)
А здесь точно нет ошибки?
По вашему описанию задачи, должно быть 2.

Попробуйте такой запрос:
select v.name,
       ( select count(1) cnt
         from `table` t2
         where t2.user = t1.user
       ) comment_cnt,
       v.comment
from (select t1.user,
             t1.comment
      from `table` t1
      where t1.manager = 'M1'
      order by t1.id desc;
      limit 1, 10
     ) v

Если результат устроит, то хорошо бы добавить пару индексов, для того что бы и время выполнения устроило.
create index idx_table_n1 on `table` (user)

и
create index idx_table_n2 on `table` (manager, id desc)


P.S.Ну и план запроса после создания индексов покажите.
23 ноя 15, 05:11    [18457580]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос на выборку и подсчёт  [new]
Gamletus
Member

Откуда:
Сообщений: 40
Guest, спасибо.
автор
А здесь точно нет ошибки?
По вашему описанию задачи, должно быть 2.

Совершенно верно подметили. Это я уже сам ошибся, должно быть действительно 2.

автор
Попробуйте такой запрос:
Сейчас попробую, обязательно отпишусь.
23 ноя 15, 10:48    [18458109]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос на выборку и подсчёт  [new]
Gamletus
Member

Откуда:
Сообщений: 40
Выдало ошибку
автор
Unknown column 't1.user' in 'where clause'
23 ноя 15, 11:00    [18458180]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос на выборку и подсчёт  [new]
Gamletus
Member

Откуда:
Сообщений: 40
И на это тоже по началу ругалась:
автор
Unknown column 'v.name' in 'field list'

Но я так понимаю там вместо name должно быть user, я исправил. Но выдало другую ошибку выше.
23 ноя 15, 11:02    [18458197]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос на выборку и подсчёт  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 18190
Gamletus
запроса, который отобразит последние 10 комментариев, при этом покажет кто именно оставил комментарий, покажет сам текст комментария и количество сколько всего оставил комментариев тот или иной пользователь.

Gamletus
Создаём таблицу:

Gamletus
Создаём комментарии:

А далее
CREATE OR REPLACE VIEW subquery
AS
SELECT `id`, `user`, `manager`, `comment`
FROM `table`
ORDER BY id DESC
LIMIT 10;

И соответственно
SELECT t1.`id`, t1.`user`, t1.`manager`, t1.`comment`, t2.`count`
FROM subquery t1,
( SELECT `user`, COUNT(`comment`) `count`
  FROM subquery
  GROUP BY `user` ) t2
WHERE t1.`user` = t2.`user`
ORDER BY t1.`id` ASC;
23 ноя 15, 12:05    [18458671]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос на выборку и подсчёт  [new]
Gamletus
Member

Откуда:
Сообщений: 40
Akina, попробовал ваш запрос, но что-то не сработало.

В общем господа, мой давний и верный друг очень сильно помог с данной ситуацией. Вот пример рабочего запроса, который быстро отображает именно то, что необходимо:
SELECT t1.id, t1.user, t1.manager, t1.comment, t3.counts FROM table AS t1 INNER JOIN
(SELECT id FROM table WHERE manager = 'М1' ORDER BY id DESC LIMIT 10) AS t2 ON t2.id = t1.id LEFT OUTER JOIN
(SELECT user, COUNT(id) AS counts FROM table GROUP BY user) AS t3 ON t3.user = t1.user

Вдруг кому-то пригодится.
Все, кто старался помочь огромнейшее спасибо ))
23 ноя 15, 19:41    [18461467]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос на выборку и подсчёт  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 18190
Gamletus
попробовал ваш запрос, но что-то не сработало.

Потому что Вы меняете задачу. То ли она за эти 2 недели поменялась, то ли Вы поняли, что сначала ошиблись с формулировкой...
23 ноя 15, 20:28    [18461610]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос на выборку и подсчёт  [new]
*
Guest
Gamletus
Выдало ошибку
автор
Unknown column 't1.user' in 'where clause'

Это потому, что я с ошибкой написал.
Должно быть так:
select v.user,
       ( select count(1) cnt
         from `table` t2
         where t2.user = v.user
       ) comment_cnt,
       v.comment
from (select t1.user,
             t1.comment
      from `table` t1
      where t1.manager = 'M1'
      order by t1.id desc;
      limit 1, 10
     ) v

MySQL-я под рукой нет, поэтому прошу извинить за ошибки...

P.S. Покажите планы для данного запроса и для своего финального варианта.
24 ноя 15, 02:31    [18462240]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос на выборку и подсчёт  [new]
alexnews
Member

Откуда: От верблюда
Сообщений: 147
Gamletus
Akina, попробовал ваш запрос, но что-то не сработало.

В общем господа, мой давний и верный друг очень сильно помог с данной ситуацией. Вот пример рабочего запроса, который быстро отображает именно то, что необходимо:
SELECT t1.id, t1.user, t1.manager, t1.comment, t3.counts FROM table AS t1 INNER JOIN
(SELECT id FROM table WHERE manager = 'М1' ORDER BY id DESC LIMIT 10) AS t2 ON t2.id = t1.id LEFT OUTER JOIN
(SELECT user, COUNT(id) AS counts FROM table GROUP BY user) AS t3 ON t3.user = t1.user

Вдруг кому-то пригодится.
Все, кто старался помочь огромнейшее спасибо ))


Gamletus, я не хочу ваc обидеть, но в вашем супе чего-то не хватает. Вы сами то этот запрос пробовали?

22	Катя	М1	коментарий	3
20	Лена	М1	коментарий	2
19	Денис	М1	коментарий	1
18	Никита	М1	коментарий	1
17	Витя	М1	коментарий	1
16	Коля	М1	коментарий	2
12	Света	М1	коментарий	4
8	Марина	М1	коментарий	1
3	Максим	М1	коментарий	2
2	Сергей	М1	коментарий	2


А куда собственно делся Паша с его 5 комментариями?
24 ноя 15, 17:47    [18466449]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос на выборку и подсчёт  [new]
Gamletus
Member

Откуда:
Сообщений: 40
Akina
Потому что Вы меняете задачу. То ли она за эти 2 недели поменялась, то ли Вы поняли, что сначала ошиблись с формулировкой...
Я потом показал свой вопрос более полным. Потому как действительно решил, что в первом сообщении как-то скудно всё показал.

*
MySQL-я под рукой нет, поэтому прошу извинить за ошибки...
P.S. Покажите планы для данного запроса и для своего финального варианта.
Я к сожалению не имею возможности показать планы выполнения, т.к. не являюсь специалистом и специального софта не имею. Ваш запрос обязательно попробую.



alexnews
Gamletus, я не хочу ваc обидеть, но в вашем супе чего-то не хватает. Вы сами то этот запрос пробовали?
Да, конечно. Всё отлично работает )))



alexnews
А куда собственно делся Паша с его 5 комментариями?
А Паши по условиям быть не должно, т.к. отображать необходимо было только последние 10 комментариев. А Паша как бы в их число не входит.
24 ноя 15, 21:07    [18467486]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос на выборку и подсчёт  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 18190
Gamletus
Я потом показал свой вопрос более полным.

Не более полным, а совершенно изменил задачу. Мой вариант даёт решение первой задачи и никакого отношения не имеет ко второй.
25 ноя 15, 00:04    [18468303]     Ответить | Цитировать Сообщить модератору
Все форумы / MySQL Ответить