У меня есть простая система обмена сообщениями - сохранение всех сообщений в одной таблице. Каждое сообщение может (и должно) быть связано с одной из трех других таблиц, которые представляют собой некоторые разделы веб-сайта. Вот создать таблицу заявлениеУсловный подсчет с группой по где пункт
CREATE TABLE `messages` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`from_user_id` int(11) DEFAULT NULL,
`to_user_id` int(11) DEFAULT NULL,
`message` text COLLATE utf8_bin,
`table1_id` int(11) DEFAULT NULL,
`table2_id` int(11) DEFAULT NULL,
`table3_id` int(11) DEFAULT NULL,
`is_unread` tinyint(1) DEFAULT NULL,
`date` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
Для каждого сообщения от table1_id, table2_id and table3_id
если какой-то столбец имеет значение, это означает, что остальные 2 равны нулю. Вот структура sqlfiddle и данные примера: http://sqlfiddle.com/#!9/b98a2/1/0.
Итак, table1_id, table2_id and table3_id
- это виды потоков, которые я использую при группировке - для отображения списка сообщений. Вот мой запрос
SELECT
id,
table1_id,
table2_id,
table3_id,
message,
from_user_id,
to_user_id,
COUNT(table1_id) AS t1_count,
COUNT(table2_id) AS t2_count,
COUNT(table3_id) AS t3_count,
MAX(CASE WHEN to_user_id = 10 AND is_unread = 1 THEN 1 END) AS is_unread,
COUNT(CASE WHEN to_user_id = 10 THEN 1 END) AS inbox_count
FROM
messages
WHERE to_user_id = 10 OR from_user_id = 10
GROUP BY table1_id,
table2_id,
table3_id
ORDER BY id DESC
и это в sqlfiddle http://sqlfiddle.com/#!9/b98a2/2/0
Этот запрос отлично работает, когда я должен показать все сообщения, но если, например, Я хочу показать только папку «Входящие» пользователя с id = 10
. Я должен проверить условие, что для каждого потока есть хотя бы одно полученное сообщение, поэтому для этого я попытался применить условие AND inbox_count > 0
, в результате которого была получена ошибка Unknown column 'inbox_count' in 'where clause'
.
Я пытаюсь перечислить сообщения, подобные gmail, - показывая количество общих сообщений (t1_count, t2_count or t3_count
) за нить, поэтому я не могу удалить часть OR from_user_id = 10
.
Почему он не может найти этот столбец и как я могу применить это условие для отображения списка полученных (исходящих) сообщений.
'inbox_count' - вычисленный столбец и недоступен в статьях' where' –
У нас есть разные определения «simple». Это плохой дизайн. – Strawberry
@Strawberry))) просто хотел сказать, что у меня нет вложенных потоков/сообщений или сообщений, связанных с другими, - это ответы. – dav