2015-05-16 2 views
3

У меня есть простая система обмена сообщениями - сохранение всех сообщений в одной таблице. Каждое сообщение может (и должно) быть связано с одной из трех других таблиц, которые представляют собой некоторые разделы веб-сайта. Вот создать таблицу заявлениеУсловный подсчет с группой по где пункт

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.

Почему он не может найти этот столбец и как я могу применить это условие для отображения списка полученных (исходящих) сообщений.

+0

'inbox_count' - вычисленный столбец и недоступен в статьях' where' –

+0

У нас есть разные определения «simple». Это плохой дизайн. – Strawberry

+0

@Strawberry))) просто хотел сказать, что у меня нет вложенных потоков/сообщений или сообщений, связанных с другими, - это ответы. – dav

ответ

2

Если я совершенно не понимают ваши намерения ... Если вы хотите, чтобы фильтр с inbox_count > 0, чтобы потом я думаю, что вы хотите добавить

HAVING COUNT(CASE WHEN to_user_id = 10 THEN 1 END) > 0 

после пункта group by. Это приведет к удалению «потоков», которые не имеют никакого сообщения с to_user = 10.

See this fiddle для и пример.

+0

Спасибо, это именно то, чего я хотел достичь. thank u – dav

+0

@dav На самом деле вы можете использовать 'HAVING inbox_count> 0' вместо выражения case, поскольку inbox_count определяется при анализе предложения having. – jpw

+0

отлично, спасибо :) – dav

Смежные вопросы