Можно ли ПОСЧИТАТЬ, если одно значение встречается больше, чем другое значение в столбце, используя SQL

#mysql #sql #database

#mysql #sql #База данных

Вопрос:

У меня есть эта таблица с именем task_status, которая имеет следующую структуру:

 CREATE TABLE `task_status` (
  `task_status_id` int(11) NOT NULL,
  `status_id` int(11) NOT NULL,
  `task_id` int(11) NOT NULL,
  `date_recorded` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

ALTER TABLE `task_status`
  ADD PRIMARY KEY (`task_status_id`);

ALTER TABLE `task_status`
  MODIFY `task_status_id` int(11) NOT NULL AUTO_INCREMENT;
COMMIT;

INSERT INTO `task_status` (`task_status_id`, `status_id`, `task_id`, `date_recorded`) VALUES
(1, 1, 16, 'Wednesday 6th of January 2021 09:20:35 AM'),
(2, 2, 17, 'Wednesday 6th of January 2021 09:20:35 AM'),
(3, 3, 18, 'Wednesday 6th of January 2021 09:20:36 AM');
 

и таблицу status_list, в которой доступны возможные статусы

 CREATE TABLE `status` (
  `statuses_id` int(11) NOT NULL,
  `status` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

ALTER TABLE `status`
  ADD PRIMARY KEY (`statuses_id`);

ALTER TABLE `status`
  MODIFY `statuses_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;
COMMIT;

INSERT INTO `status` (`statuses_id`, `status`) VALUES
(1, 'Yes'),
(2, 'Inprogress'),
(3, 'No');
 

Теперь я хочу проверить, какое число встречается больше в столбце status_id 1 произошло больше, 2 произошло больше или 3 произошло больше? использование SQL.

Возможно ли это сделать, и если да, то как?

Комментарии:

1. Вы имеете в виду status_id из [task_status] и statuses_id из [status]?

2. @T.Peter Я имею в виду значение из status_id

3. В следующий раз просто предоставьте результаты SHOW CREATE TABLE . Это позволяет избежать утомительного отвлечения внимания на все эти ALTER TABLE вещи

4. @Strawberry Хорошо, я должен отредактировать вопрос и избавиться от содержимого alter table?

5. @Strawberry это столбец.

Ответ №1:

Сначала вы можете count отфильтровать столбец с помощью max
существует много разных способов сделать это, но я предпочитаю использовать cte. Вот пример :

 with cte as(
select status_id,count(*) cnt from task_status 
group by status_id
)
select * from cte
where cnt = (select max(cnt) from cte)
 

также здесь есть db<>fiddle для лучшего изучения.
Я изменяю некоторые данные, чтобы показать гораздо более понятный вывод. Но идея та же.

кроме того, я действительно не думаю status , что в таблице есть какая-либо работа, но напомните мне, если я неправильно понимаю, что вы имеете в виду.

Комментарии:

1. Потрясающий и хорошо объясненный ответ спасибо за помощь, на самом деле таблица status объединена с таблицей task_status в моем php-коде, но да, что касается вопроса, это было нерелевантно, извините за это.

2. пожалуйста, в следующий раз постарайтесь предоставить более четкую информацию, которая может привести к лучшему и более быстрому ответу: D

3. Да, я буду стараться изо всех сил 🙂

Ответ №2:

Вы можете попробовать и РАЗДЕЛИТЬ ПО предложениям, вы просто указываете столбец, по которому хотите разделить свои агрегированные результаты.

Пример кода

 select status_id,count(*) over (partition by status_id) as Count_1 from task_status
 

Комментарии:

1. не могли бы вы немного отформатировать и объяснить свой код? но все же спасибо за ответ.

2. Вы можете попробовать следующий код select status_id,count(*) over (partition by status_id) as Count_1 from task_status

Ответ №3:

Если вам нужен ровно один статус, который встречается чаще, чем другие, тогда я бы рекомендовал group by использовать order by и limit :

 select status_id, count(*) as cnt
from task_status 
group by status_id
order by cnt desc
limit 1;
 

Это всегда возвращает одну строку, поэтому, если есть связи для наиболее распространенных, вы получаете только одну из связей.