MySQL как хранить два разных объекта, которые потом используются вместе

92
18 января 2022, 09:20

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

  1. "images" с колонками id | title | image_url | url

  2. "text messages" с колонками id | text message

Скрипт должен брать из обоих таблиц информацию об объектах и отсылать их пользователю в чат, в заданном админом, порядке

Например, Фото - Текст - Текст - Фото

Вопрос: Как лучше реализовать получение данных? С помощью третей таблицы (где будет хранится порядок этих структур) или что-то другое?

Answer 1

Думаю, наилучшим решением будет создание связующей таблицы:

CREATE TABLE links ( id BIGINT NOT NULL PRIMARY KEY,
                     keyword VARCHAR(??) NOT NULL,
                     id_image INT,
                     FOREIGN KEY fk_image (id_image) 
                         REFERENCES images (id)
                         ON DELETE SET NULL
                         ON UPDATE CASCADE,
                     id_message INT,
                     FOREIGN KEY fk_message (id_message) 
                         REFERENCES messages (id)
                         ON DELETE SET NULL
                         ON UPDATE CASCADE,
                     `order` INT NOT NULL,
                     UNIQUE (keyword, order),
                     CHECK (((id_image IS NULL) + (id_message IS NULL)) = 1)
);

В запрос передаётся строковый параметр @keyword, полученный обработкой ввода пользователя, а в ответку улетает:

SELECT images.*, 
       messages.*, 
       links.*
FROM links
LEFT JOIN images ON links.id_image = images.id
LEFT JOIN messages ON messages.id_message = messages.id
WHERE links.keyword = @keyword
ORDER BY links.order

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

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

PS. Структура разрешает один объект (картинку из images или текст из messages) использовать для нескольких ключевых слов, но для каждого ключевого слова этот объект будет иметь свою запись в links, со своим порядковым номером.

PPS. Структура не требует последовательных значений в поле order. Достаточно, чтобы меньше-больше соответствовал требуемому раньше-позже.

READ ALSO
Как с помощью PHP выбрать два последних input?

Как с помощью PHP выбрать два последних input?

Как с помощью PHP выбрать два последних input? при учете что цифры это id из таблицы БД

97
Как сортировать файлы по дате в PHP?

Как сортировать файлы по дате в PHP?

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

90
MySQL выборка групп

MySQL выборка групп

Есть таблица:

102
Помогите с запросом SQL на выборку данных

Помогите с запросом SQL на выборку данных

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

93