我正在为拍卖中的用户编写警报系统。我需要建立一个用户列表,其中包含与其关键字匹配的拍卖品列表。 我有一个包含几千行的用户表,每个用户可以从第二个表中拥有多个关键字。我需要搜索所有这些关键字的拍卖地块表(标题和主体),有几千个批次....
什么是查询次数最少的最佳方法?
CREATE TABLE `auction_lots` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(50) NOT NULL,
`body` text NOT NULL,
PRIMARY KEY (`id`),
FULLTEXT KEY `search` (`body`,`title`)
);
CREATE TABLE `user_accounts` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`is_active` tinyint(1) unsigned NOT NULL DEFAULT '0',
`firstname` varchar(20) NOT NULL,
`lastname` varchar(20) NOT NULL,
`email` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `user_keywords` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(10) unsigned NOT NULL,
`keyword` varchar(20) NOT NULL,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`)
);
我正在考虑... 2个查询,获取所有关键字,获取与所有关键字匹配的所有批次,然后使用PHP构建用户批次列表 或以某种聪明的方式使用子查询?!
你觉得怎么样? 非常感谢,抢劫。
答案 0 :(得分:0)
SELECT t1.id, t1.title, t2.keyword, t3.id, t3.firstname, t3.lastname, t3.email, count(t1.id) AS count
FROM auction_lots t1
INNER JOIN user_keywords AS t2 ON
( t1.body LIKE CONCAT( '%', t2.keyword, '%' ) )
INNER JOIN user_accounts AS t3 ON
t2.user_id = t3.id
WHERE t3.is_active = 1
group by t2.keyword, t2.user_id
order by t2.user_id
你是如何解决这个问题的?
我有相同的数据和任务,不同的行业。到目前为止,我已经提出了上述内容,我将其转换为适合您的数据,但它只会加入一个字段t1.body并且在针对具有数千行的表进行基准测试时性能不是很好。任何更好的解决方案,我都是耳朵......