SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 31.03.2014 03:35:26

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

UPDATE LIKE

помогите решить задачку пожалуйста

существует поле (id_users) в котором должны быть id пользователей через запятую (102,105,184)

как с помощью запроса UPDATE добавить или удалить определенный id?

Неактивен

 

#2 31.03.2014 09:43:31

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: UPDATE LIKE

только через строковые функции http://dev.mysql.com/doc/refman/5.5/en/ … tions.html
если есть возможность, лучше изменить структуру базы

Неактивен

 

#3 31.03.2014 10:32:05

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: UPDATE LIKE

По той ссылке что вы дали и по строковым функциям мне мало что понятно((
А что вы имеете ввиду по поводу другой структуры?

Неактивен

 

#4 31.03.2014 12:26:55

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: UPDATE LIKE

serj011 написал:

По той ссылке что вы дали и по строковым функциям мне мало что понятно((

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

serj011 написал:

А что вы имеете ввиду по поводу другой структуры?

в таких случаях используют вспомогательную таблицу (id_user, id), т.е.
5, 102
5, 105
5, 184

Тогда для добавления или удаления вы используете простой Insert или delete

Неактивен

 

#5 31.03.2014 13:30:35

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: UPDATE LIKE

Вообще изначально я так и хотел, я бы с такой структурой быстрее разобрался... но дело в том что этот модуль в таком исполнении предусматривает большое количество строк. я хочу реализовать систему лайков новостей пользователями. при количестве допустим 3000 пользователей, который лайкнут хотя бы по 200 новостей это уже будет 600000 тысяч строк. насколько это много и как лучше поступить?

Неактивен

 

#6 31.03.2014 13:36:54

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: UPDATE LIKE

преждевременная оптимизация - зло.
делайте отдельную таблицу, составной индекс, правильные типы данных (например, smallint или mediumint вместо int) и все будет летать

Неактивен

 

#7 31.03.2014 14:13:57

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: UPDATE LIKE

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

Неактивен

 

#8 31.03.2014 14:43:03

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: UPDATE LIKE

что-то вроде

create table `имя таблиццы` (user_id smallint unsigned not null, news_id mediumint unsigned not null, unique index(user_id,news_id), index (news_id)) engine=myisam;


по индексам посмотрите FAQ №5 там толково описано
порядок полей в составном индексе зависит от того какие запросы будут в основном идти к этой таблице.
типы данных зависят от размеров базы
smallint unsigned от 0 до 65535
mediumint unsigned от 0 до 16млн

Неактивен

 

#9 31.03.2014 15:51:53

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: UPDATE LIKE

попытался почитать FAQ №5, и вообще в интернете про составные индексы и типы данных. честно говоря сложновато, наверное потому что практики не было.

vasya написал:

порядок полей в составном индексе зависит от того какие запросы будут в основном идти к этой таблице.

подразумевается
WHERE user_id='5' and news_id='100' или наоборот WHERE news_id='5' and user_id='100'

vasya написал:

типы данных зависят от размеров базы

если изначально у меня будет небольшая база от 100 строк, которые постепенно будут увеличиваться, нужно ли ставить такие типы данных?

vasya написал:

smallint unsigned от 0 до 65535
mediumint unsigned от 0 до 16млн

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

Неактивен

 

#10 31.03.2014 19:19:30

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: UPDATE LIKE

serj011 написал:

vasya написал:

порядок полей в составном индексе зависит от того какие запросы будут в основном идти к этой таблице.

подразумевается
WHERE user_id='5' and news_id='100' или наоборот WHERE news_id='5' and user_id='100'

Нет, в таком случае порядок не важен.
Моя мысль была в том, что возможно удастся обойтись одним только составным индексом. Но можно этим не заморачиваться и использовать предложенный выше вариант.


serj011 написал:

vasya написал:

типы данных зависят от размеров базы

если изначально у меня будет небольшая база от 100 строк, которые постепенно будут увеличиваться, нужно ли ставить такие типы данных?

vasya написал:

smallint unsigned от 0 до 65535
mediumint unsigned от 0 до 16млн

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

К количеству строк это отношения не имеет. Речь идет о том какое максимальное число может храниться в данной ячейке.
Разные типы, потому что ткнув пальцем в небо, я предположил, что новостей будет больше чем пользователей, но меньше чем 16 млн.
Хватит ли для пользователей значений до 65тыс, решать вам. Лучше наверное и там и там сделать mediumint.

Неактивен

 

#11 31.03.2014 21:51:24

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: UPDATE LIKE

vasya написал:

К количеству строк это отношения не имеет. Речь идет о том какое максимальное число может храниться в данной ячейке.

а для чего тогда нужна длина значения?
smallint(5) mediumint(8) - вот такая длина значения была создана автоматически при создании таблицы

Неактивен

 

#12 31.03.2014 22:25:20

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: UPDATE LIKE

посмотрите http://sqlinfo.ru/forum/viewtopic.php?id=2258

со smallint учтите, что если у вас счетчик пользователей станет больше чем 65535, то произойдет ошибка.

Неактивен

 

#13 31.03.2014 23:13:22

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: UPDATE LIKE

пока не все понятно, но будем продвигаться) спасибо)

Неактивен

 

#14 03.04.2014 00:36:33

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: UPDATE LIKE

vasya, у меня еще вопрос, как правильнее проверить существует ли запись если таблица такой структуры как вы предлагали

user_id = 100
news_id = 5

если бы в таблице был уникальный id, то я бы проверял

$result_like = mysql_query("SELECT id FROM like WHERE user_id='{$user_id}' and news_id='{$news_id}'", $db );
$myrow_like = mysql_fetch_array($result_like);


потом

if(isset($myrow_like["id"]))
{
}


и еще вопрос, опять же если таблица такой структуры из двух связанных полей. можно ли добавить еще одно или два поля?

Неактивен

 

#15 03.04.2014 00:45:56

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: UPDATE LIKE

1.  select 1 as id ...
или проверяйте количество возвращенных строк с помощью  mysql_num_rows()

2. можно, но не очень понятно зачем зачем?

Неактивен

 

#16 03.04.2014 00:59:04

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: UPDATE LIKE

vasya написал:

1.  select 1 as id ...
или проверяйте количество возвращенных строк с помощью  mysql_num_rows()

vasya, если можно напишите пример запроса через mysql_num_rows()

vasya написал:

2. можно, но не очень понятно зачем зачем?

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

Неактивен

 

#17 03.04.2014 01:02:32

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: UPDATE LIKE

$result = mysql_query("SELECT * FROM user_id='{$user_id}' and news_id='{$news_id}'", $link);
$num_rows = mysql_num_rows($result);

потом
if($num_rows == '1')
{
}

вот так?

Неактивен

 

#18 03.04.2014 01:06:51

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: UPDATE LIKE

вроде того, только замените * на 1
и зачем вы 1 берете в кавычки?

Неактивен

 

#19 03.04.2014 01:10:32

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: UPDATE LIKE

vasya написал:

вроде того, только замените * на 1
и зачем вы 1 берете в кавычки?

не знаю зачем, я думал так правильно) не нужно?

и по поводу дополнительных полей, если у меня будет в этом необходимость, сделать отметку как я писал, это будет правильно?

Неактивен

 

#20 03.04.2014 01:50:23

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: UPDATE LIKE

serj011 написал:

не знаю зачем, я думал так правильно) не нужно?

нет, num_rows возвращает число, а в качывках строка


serj011 написал:

и по поводу дополнительных полей, если у меня будет в этом необходимость, сделать отметку как я писал, это будет правильно?

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

Неактивен

 

#21 03.04.2014 09:25:24

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: UPDATE LIKE

vasya написал:

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

вы имеете в виду 1 или 10? я думаю 10, по типу как на одноклассниках

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson