MySQL, загружающий строки через содержимое строки - PullRequest
0 голосов
/ 19 февраля 2019

Я делаю кнопку «Мне нравится» для веб-сайта портфолио, над которым я работаю, и я немного озадачен собственным кодом!

У меня есть две таблицы MySQL:

  • img_all : содержит все изображения на сервере (каждое изображение имеет 6 INT id)
  • логин : содержит учетную записьинформация для всех пользователей сайта (каждый пользователь имеет 6 INT идентификатор, а также VARCHAR столбец с надписью «лайки»)

Способ моей системывыложенКогда пользователь «любит» изображение, я сохраняю его идентификатор в столбце таблицы входа в систему.

UPDATE login SET likes = CONCAT(likes,':$img_id:') WHERE user_key = $user_id;

, а когда он не похож на изображение:

UPDATE login SET likes = REPLACE(likes,':$img_id:','') WHERE user_key = $user_id;

.строки в столбце likes похожи на это:

:456093:475829:203944:789203:

Моя проблема начинается здесь.Я делаю страницу, которая позволяет пользователям просматривать все картинки, которые им понравились (назовем этот файл «Likes.php»).Однако список понравившихся картинок сохраняется в таблице login , а фактическая информация о снимке сохраняется в img_all .

Как тогда взять список изmy login table и переведите его, чтобы выбрать эти изображения из img_all ?Я думал об использовании смеси:

SELECT user_key FROM login WHERE likes LIKE '%:$img_id:%';

и

while();

Я также подумал о запросе SQL.Я знаю, что это не сработает.Однако, надеюсь, это также поможет передать то, что я пытаюсь достичь!

SELECT * FROM
img_all WHERE id =
      SELECT likes FROM login
            WHERE likes LIKE '%:$img_id:%' AND user_key = '$user_id';

Спасибо за ваше время!Если у вас есть дополнительные вопросы по поводу кода, пожалуйста, дайте мне знать!

1 Ответ

0 голосов
/ 20 февраля 2019

Вы почти у цели.Вместо использования подзапроса вы можете превратить ваш запрос в JOIN, например:

SELECT i.*
FROM img_all i
INNER JOIN login l ON l.likes LIKE CONCAT('%:', l.img_id, ':%')
WHERE user_id = ?

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

Доступ к данным и их изменение требуют манипулирования строками, что нелегко сделать с SQL, подвержено ошибкам и совершенно неэффективно.Кроме того, как прокомментировал Билл Карвин , количество лайков, которые вы можете сохранить для одного пользователя, ограничено максимальным размером строкового столбца.

Как прокомментировал tim, вы должны использовать отдельную таблицу для хранения likes с внешними ключами для таблиц login и img_all.

CREATE TABLE likes (
    like_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    img_id  INT NOT NULL,
    PRIMARY KEY (like_id),
    FOREIGN KEY fk_likes_login(user_id) REFERENCES login(user_id),
    FOREIGN KEY fk_likes_img(img_id) REFERENCES  img_all(img_id)
);

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

Затем вы можете получить все изображения, которые понравились пользователю, с помощью простого JOIN ed запроса:

SELECT i.*
FROM likes 
INNER JOIN img_all ON img_all.img_id = likes.img_id
WHERE likes.user_id = ?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...