Mysql: подсчет значений, разделенных запятыми, с помощью Like - PullRequest
0 голосов
/ 30 апреля 2009

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

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

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

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

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

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

Ответы [ 4 ]

5 голосов
/ 30 апреля 2009

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

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

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

3 голосов
/ 30 апреля 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
2 голосов
/ 02 июня 2009

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

SELECT count(id) FROM messages WHERE FIND_IN_SET('userid',favs) > 0
1 голос
/ 30 апреля 2009

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

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

...