Mysql: подсчет значений, разделенных запятыми, с помощью Like

Я решил использовать избранное (идентификаторы пользователей, которые отметили это сообщение как избранное) в виде списка, разделенного запятыми, в столбце избранного, который также находится в таблице сообщений с отправителем, URL-адресом, содержанием и т. д..

Но когда я пытаюсь подсчитать эти строки с помощью запроса вроде:

select count(id) 
from messages 
where favs like '%userid%' 

конечно, он возвращает неправильный результат, потому что все идентификаторы могут быть частью другого

Например, при запросе id=1 счетчик также увеличивается для любого другого контента, избранного пользователем с id 11...

Не могли бы вы рассказать мне свою идею или какое-либо решение, чтобы заставить эту систему работать?


person jnbn    schedule 30.04.2009    source источник


Ответы (4)


С несколькими или у вас может быть уродливое решение:

select count(id) from messages where favs like 'userid,%' or favs like '%,userid,%' or favs like '%,userid'

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

person Warren Krewenki    schedule 30.04.2009

Можно ли изменить вашу модель данных таким образом, чтобы связь между пользователями и их любимыми сообщениями вместо этого сохранялась в другой таблице?

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

Альтернативная модель может выглядеть примерно так (не могу включать изображение, так как я новый пользователь, но я сделал его здесь):

users
 - id

messages
 - id

favorite_messages
 - user_id (foreign key to users.id)
 - message_id (foreign key to messages.id)

При этом ваш исходный запрос будет упрощен до следующего:

select count(1) from favorite_messages where user_id = userid

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

select 
    * 
from 
    messages 
    inner join favorite_messages 
        on messages.id = favorite_messages.message_id
where
    user_id = userid
person Jason Jones    schedule 30.04.2009

следует использовать это:

SELECT count(id) FROM messages WHERE FIND_IN_SET('userid',favs) > 0
person Community    schedule 02.06.2009

Возможно, вам придется получить значение, взорвать его с помощью PHP, а затем подсчитать массив.

Есть способы сделать это в MySQL, но из того, что я видел, они хлопотны.

person alex    schedule 30.04.2009