dak
Guest
SQL запрос для выбора новостей по нескольким темам
Задача состоит в том, чтобы переписать SQL запрос, а может, если надо и оптимизировать текущую схему, для реализации выбора из базы новостей, которые принадлежат сразу всем "темам" из некоторого списка. На текущий момент имеется следующая реализации, и она успешно работает. Но есть подозрение, что можно сделать как-то лучше, а то шибко запрос тяжелый.
Реализация выбора сообщений по нескольким темам:
-------------------------------------------------------------------------------
-- Table structure for table 'News'
-- Таблица новостей
-------------------------------------------------------------------------------
create table News
(
NewsId int(11) not null auto_increment,
Body text,
primary key (NewsId)
) type=MyISAM;
-------------------------------------------------------------------------------
-- Table structure for table 'Topics'
-- Таблица тем новостей (топиков)
-------------------------------------------------------------------------------
create table Topics
(
TopicId int(11) not null auto_increment,
Description text,
primary key (TopicId)
) type=MyISAM;
-------------------------------------------------------------------------------
-- Table structure for table 'News_Topic'
-- Таблица перевязки новость-тема
-------------------------------------------------------------------------------
create table News_Topic
(
NewsId int(11) default null,
TopicId int(11) default null
primary key (NewsId, TopicId)
) type=MyISAM;
-------------------------------------------------------------------------------
SQL запрос
-------------------------------------------------------------------------------
$MsgFilter - имя новой временной таблицы
$MidString - id-шники топиков через запятую по которым мы выбираем
$TopicsNum - число этих id-шников
create temporary table $MsgFilter
select NewsId
from news_topic
where TopicId in ($MidString)
group by NewsId
having count(TopicId) = $TopicsNum;
После выполнения запроса в таблице $MsgFilter содержаться id-шники всех
новостей, имеющие все темы из спика.
Буду рад, если кто-то поделится своими идеями и соображениями. Идея-то в подобной веще не нова, и думаю, сталкивалис с нею многие.
Задача состоит в том, чтобы переписать SQL запрос, а может, если надо и оптимизировать текущую схему, для реализации выбора из базы новостей, которые принадлежат сразу всем "темам" из некоторого списка. На текущий момент имеется следующая реализации, и она успешно работает. Но есть подозрение, что можно сделать как-то лучше, а то шибко запрос тяжелый.
Реализация выбора сообщений по нескольким темам:
-------------------------------------------------------------------------------
-- Table structure for table 'News'
-- Таблица новостей
-------------------------------------------------------------------------------
create table News
(
NewsId int(11) not null auto_increment,
Body text,
primary key (NewsId)
) type=MyISAM;
-------------------------------------------------------------------------------
-- Table structure for table 'Topics'
-- Таблица тем новостей (топиков)
-------------------------------------------------------------------------------
create table Topics
(
TopicId int(11) not null auto_increment,
Description text,
primary key (TopicId)
) type=MyISAM;
-------------------------------------------------------------------------------
-- Table structure for table 'News_Topic'
-- Таблица перевязки новость-тема
-------------------------------------------------------------------------------
create table News_Topic
(
NewsId int(11) default null,
TopicId int(11) default null
primary key (NewsId, TopicId)
) type=MyISAM;
-------------------------------------------------------------------------------
SQL запрос
-------------------------------------------------------------------------------
$MsgFilter - имя новой временной таблицы
$MidString - id-шники топиков через запятую по которым мы выбираем
$TopicsNum - число этих id-шников
create temporary table $MsgFilter
select NewsId
from news_topic
where TopicId in ($MidString)
group by NewsId
having count(TopicId) = $TopicsNum;
После выполнения запроса в таблице $MsgFilter содержаться id-шники всех
новостей, имеющие все темы из спика.
Буду рад, если кто-то поделится своими идеями и соображениями. Идея-то в подобной веще не нова, и думаю, сталкивалис с нею многие.