Объединение запросов MySQL

226
18 июля 2017, 18:50

Написал простой почтовый модуль для сайта. В таблице хранятся письма, где есть таке поля как получатель, статус прочтения, папка которой принадлежит письмо. Юзер кликает на нужную папку с письмами и получает список:

SELECT * FROM `message` WHERE `idreciver` = "<получатель>" AND `folder` = <нужная папка>

Но мне нужно в общей среде с папками показать пользователю сколько писем лежит в каждой папке. (Например: Входящие (15), Исходящие (25), Архивные (10).

Я делаю 3 запроса с просчётом строк и помещаю данные в нужные поля:

$писем в папке  1 = SELECT COUNT(*) FROM `message` WHERE `idreciver` = "<получатель>" AND `folder` = <папка 1>
$писем в папке  2 = SELECT COUNT(*) FROM `message` WHERE `idreciver` = "<получатель>" AND `folder` = <папка 2>
$писем в папке  3 = SELECT COUNT(*) FROM `message` WHERE `idreciver` = "<получатель>" AND `folder` = <папка 3>

Я уже понимаю что это бред, а если папок 100? Но проблема усугубляется, когда мне нужно посчитать сколько в каждой из папок не прочтённых писем.

У каждой строки есть поля "readed" со статусом прочтения. И что бы мне вывести пользователю не просто количество писем по папкам но и сколько из них писем прочтённые а сколько не прочтённые, мне что, нужно сделать ещё 6 запросов для 3 папок? Как сделать правильно?

Answer 1

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

SELECT `folder`,
    COUNT(*) as all_messages, /* Все сообщения в папке */
    sum(`readed`) as readed_messages, /* Только прочтенные сообщения */
    sum(if(`readed` = 0, 1, 0)) as unread_messages /* Только непрочтенные сообщения */
FROM `message` 
WHERE `idreciver` = "<получатель>" 
group by `folder`

Пример на sqlfiddle.

READ ALSO
Почему AJAX не отправляет данные?

Почему AJAX не отправляет данные?

У меня простой ajax запрос который должен отправлять input на сервер через сервлет не перезагружая страницуНо сервер не получает данные

262
Как запустить тест с maven?

Как запустить тест с maven?

Добрый день, пытаюсь запустить тест командой

367
Реализовать поиск на андроид [требует правки]

Реализовать поиск на андроид [требует правки]

Как реализовать поиск, есть массив с заголовками книг, поле для ввода текста, при вводе пары букв должны выводиться совпадения

278