Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

PHP Система лайков других пользователй в таблице!

n0bleman Ученик (3), открыт 1 неделю назад
КАк сделать чтобы один аккаунт мог лайкнуть определенного пользователя в табилце Users тоьлко один раз но мог лайкать тех кого не лайкал ?
Есть таблица Users с пользователями id = уникальный адрес каждого
Есть таблица Accounts с зарегетсрироваными акаунтами надо сделать чтобы Пользователь из таблицыы Accounts могу лайкать пользователй и таблицы Users но за каждого только 1 раз как правильно хранить данные лайков и сверять все в 1 запросе MYSQL если у меня для target_id VARCHAR(100) будет то тут сколько строк то влетез ?
Например создаеть еще 1 таблицу likes

в которой будет строка id пользователя из Accounts КТО ЛАЙКНУЛ и target_id кого он лайкнул так вот как хранить это все в target id и потом проверять через select count ? и как потом все сверять ? елси он лайкнул 300 пользователй строка в mysql уместится ?

id = 5555
target_id = 321321,412412412,21421421,2141241,4214124,41241,5512,
Дополнен 1 неделю назад
как проверить 1 запросом ? Что в таблице id = target_id ?

likes таблица с колонками
id
target_id

id target_id
Дополнен 1 неделю назад
таблица like должна быть с авто инекрментом ? Значит если он просто список проверяет
Дополнен 1 неделю назад
id = Айди списка таблица
usernameid = Кто голосовал
target_id = кого он проголосвал и если в таблице есть совпадения то он уже голосвал
Дополнен 1 неделю назад
Думаю решение нашел ) правильно или нет
SELECT COUNT(*) FROM likes WHERE id = 1000 AND target_id = 5000;
2 ответа
speexz Мыслитель (7194) 1 неделю назад
Для реализации системы лайков, где один пользователь из таблицы `Accounts` может лайкнуть другого пользователя из таблицы `Users` только один раз, оптимальным решением будет создание отдельной таблицы `likes`. Хранение лайков в виде одной строки с перечислением ID (например, `target_id = 321321,412412412,...`) — это плохая практика, так как нарушается нормализация базы данных и возникают проблемы с производительностью и масштабируемостью.

Вот как это можно сделать:

---

### 1. **Создание таблицы `likes`**
Эта таблица будет содержать данные о том, кто кого лайкнул:
 CREATE TABLE likes (
id INT AUTO_INCREMENT PRIMARY KEY, -- Уникальный ID записи
account_id INT NOT NULL, -- ID аккаунта, который лайкнул
target_id INT NOT NULL, -- ID пользователя, которого лайкнули
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- Время лайка
UNIQUE (account_id, target_id) -- Уникальность пары "кто-кого лайкнул"
);

### 2. **Логика вставки лайков**
Чтобы пользователь мог лайкнуть другого только один раз, при добавлении лайка используйте запрос с проверкой уникальности:
 INSERT INTO likes (account_id, target_id)
VALUES (?, ?)
ON DUPLICATE KEY UPDATE id = id; -- Если запись уже существует, запрос ничего не делает

### 3. **Проверка, лайкнул ли пользователь другого**
Для проверки, лайкал ли пользователь `account_id` другого пользователя `target_id`, выполните запрос:
 SELECT COUNT(*) 
FROM likes
WHERE account_id = ? AND target_id = ?;

Если результат запроса равен `1`, значит пользователь уже лайкнул. Если `0` — не лайкнул.

### 4. **Получение количества лайков для пользователя**
Чтобы узнать, сколько лайков получил конкретный пользователь:
 SELECT COUNT(*) AS likes_count
FROM likes
WHERE target_id = ?;

### 5. **Преимущества хранения в отдельной таблице**
1. **Масштабируемость**: Даже если у пользователя будет 1 миллион лайков, это никак не повлияет на производительность. Каждая пара лайков — это отдельная строка.
2. **Поиск и фильтрация**: Используя индексы, вы сможете быстро проверять и подсчитывать лайки.
3. **Уникальность**: Уникальный индекс (`UNIQUE (account_id, target_id)`) гарантирует, что один пользователь может лайкнуть другого только один раз.

---

### Пример использования:


- UserA (из `Accounts`) лайкнул TargetX и TargetY.
- UserB (из `Accounts`) лайкнул TargetX.

---

### Ожидаемое поведение:
1. Если UserA пытается снова лайкнуть TargetX, запрос ничего не делает.
2. Если UserA лайкает TargetZ, новая запись добавляется в таблицу `likes`.

Этот подход обеспечивает правильное хранение и позволяет эффективно обрабатывать запросы.
V̲i̲s̲t̲a̲s̲t̲e̲r̲ Искусственный Интеллект (269269) 1 неделю назад
Лайк надо хранить true/false (поставил/снял) и ничего по таблице проверять не нужно категорически. Время лайка хранить — извращение.
n0blemanУченик (3) 1 неделю назад
Время лайков никто и не хранит
Похожие вопросы