#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;
Это всегда возвращает одну строку, поэтому, если есть связи для наиболее распространенных, вы получаете только одну из связей.