MySQL / Поиск в двух таблицах

#mysql #sql #database #database-design

#MySQL #sql #База данных #Проектирование базы данных

Вопрос:

У меня есть две таблицы: «фотографии» и «видео». Вместе они почти идентичны, за исключением одного столбца: «PhotoID» в «photos» и «VideoID» в «videos».

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

Как это возможно сделать, используя разные имена столбцов? Если это не так, должен ли я изменить имена столбцов на что-то вроде ContentID в обеих таблицах и использовать ОБЪЕДИНЕНИЕ для их объединения? Изменение столбцов требует много работы, но придется, если это невозможно…

Комментарии:

1. Почему они не находятся в одной таблице, а столбец определяет его тип (видео / фото)? Да, объединение может решить вашу проблему, но, похоже, ваш дизайн неправильный

2. Что вы используете для поиска? MyISAM полнотекстовый? Сфинкс? Solr? Прямо КАК запросы?

3. вы могли бы создать объединение, которое не отображает PhotoID и VideoID

4. @Cody Caughlan — Я использую полнотекстовый файл MyISAM

5. @Andre — Я решил разделить две таблицы для повышения производительности, к концу следующего года в таблице photos будет более 1 000 000 строк, таблица videos может быть аналогичного размера. Кроме того, не у всех моих пользователей есть разрешение на поиск в обеих таблицах, поэтому я предоставляю производительность пользователям, у которых нет этого разрешения, только для поиска в одной таблице

Ответ №1:

Вам не нужно изменять имена столбцов в таблицах. Просто используйте псевдоним в SELECT . Я бы выбрал a UNION ALL (более эффективный, чем UNION поскольку он не будет пытаться устранить дубликаты) и добавил дополнительный столбец, чтобы определить, откуда взялся контент.

 SELECT photoID AS contentID, colA, colB, ..., 'photo' AS ContentType
    FROM photos
UNION ALL
SELECT videoID AS contentID, colA, colB, ..., 'video' AS ContentType
    FROM videos
  

Комментарии:

1. Спасибо, Джо, информативный ответ. Мне интересно узнать, как я могу использовать дополнительный столбец, как вы предложили выше. Я никогда раньше не видел этот метод…

Ответ №2:

 Select * from
(
SELECT VideoID as MediaID, * FROM Videos
UNION
SELECT PhotoID as MediaID, * FROM Photos
) as T
WHERE MediaID = ?
  

Ответ №3:

используйте что-то похожее на

 select photoID AS ContentID, col1, col2 FROM PHOTOS WHERE col1 =...
UNION
select videoID AS ContentID, col1, col2 FROM VIDEOS WHERE col1 =...
  

Ответ №4:

 select column1, column2, NULL videoID, photoID 
from photos
where criteria = 'criteria'

union all

select column1, column2, videoID, NULL photoID 
from videos
where criteria = 'criteria'
  

Ответ №5:

Если вы хотите создать объединение без отображения PhotoID и VideoID, вы можете сделать это следующим образом:

 SELECT column names from Videos 
UNION
SELECT column names from Photos