首先执行这些表和数据转储:-
CREATE TABLE IF NOT EXISTS `Tags` (
`id_tag` int(10) unsigned NOT NULL auto_increment,
`tag` varchar(255) default NULL,
PRIMARY KEY (`id_tag`),
UNIQUE KEY `tag` (`tag`),
KEY `id_tag` (`id_tag`),
KEY `tag_2` (`tag`),
KEY `tag_3` (`tag`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=18 ;
INSERT INTO `Tags` (`id_tag`, `tag`) VALUES
(1, 'key1'),
(2, 'key2');
CREATE TABLE IF NOT EXISTS `Tutors_Tag_Relations` (
`id_tag` int(10) unsigned NOT NULL default '0',
`id_tutor` int(10) default NULL,
KEY `Tutors_Tag_Relations` (`id_tag`),
KEY `id_tutor` (`id_tutor`),
KEY `id_tag` (`id_tag`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `Tutors_Tag_Relations` (`id_tag`, `id_tutor`) VALUES
(1, 1),
(2, 1);
以下查询从 Tutors_Tag_Relations 表中查找至少引用术语“key1”或“key2”之一的所有导师。
SELECT td . *
FROM Tutors_Tag_Relations AS td
INNER JOIN Tags AS t ON t.id_tag = td.id_tag
WHERE t.tag LIKE "%key1%"
OR t.tag LIKE "%key2%"
Group by td.id_tutor
LIMIT 10
请帮助我修改此查询,以便它返回 Tutors_Tag_Relations 表中引用术语“key1”和“key2”(AND 逻辑而不是 OR 逻辑)的所有导师。请建议考虑大量数据记录的优化查询(该查询不应单独获取与每个关键字匹配的两组导师,然后找到交集)。
Update
将问题提升到一个新的水平。请运行以下新查询:-
=================================================== ===================================
如果不存在则创建表learning_packs_tag_relations
(
id_tag
int(10) 无符号非空默认“0”,id_tutor
int(10) 默认为空,id_lp
int(10) 无符号默认为 NULL,
钥匙Learning_Packs_Tag_Relations_FKIndex1
(id_tag
),
钥匙id_lp
(id_lp
),
钥匙id_tag
(id_tag
)
) 引擎=InnoDB 默认字符集=latin1;
如果不存在则创建表learning_packs
(
id_lp
int(10) 无符号非空自动增量,id_status
int(10) 无符号非空默认“2”,id_author
int(10) 无符号非空默认“0”,name
varchar(255) NOT NULL 默认 '',
首要的关键 (id_lp
)
) 引擎=InnoDB 默认字符集=utf8 AUTO_INCRMENT=21 ;
如果不存在则创建表tutors_tag_relations
(
id_tag
int(10) 无符号非空默认“0”,id_tutor
int(10) 默认为空,
KEY Tutors_Tag_Relations
(id_tag
),
钥匙id_tutor
(id_tutor
),
钥匙id_tag
(id_tag
)
) 引擎=InnoDB 默认字符集=latin1;
如果不存在则创建表users
(
id_user
int(10) 无符号非空自动增量,name
varchar(100) NOT NULL 默认 '',surname
varchar(155) NOT NULL 默认 '',
首要的关键 (id_user
)
) 引擎=InnoDB 默认字符集=utf8 AUTO_INCRMENT=52 ;
如果不存在则创建表tutor_details
(
id_tutor
int(10) 非空自动增量,id_user
int(10) 不为空,
首要的关键 (id_tutor
)
) 引擎=InnoDB 默认字符集=latin1 AUTO_INCRMENT=60 ;
如果不存在则创建表tags
(
id_tag
int(10) 无符号非空自动增量,tag
varchar(255) 默认为空,
首要的关键 (id_tag
),
独特的钥匙tag
(tag
)
) 引擎=InnoDB 默认字符集=latin1 AUTO_INCRMENT=5 ;
修改表learning_packs_tag_relations
添加约束Learning_Packs_Tag_Relations_ibfk_1
外键(id_tag
) 参考tags
(id_tag
) 删除时不执行任何操作,更新时不执行任何操作;
修改表learning_packs
添加约束Learning_Packs_ibfk_2
外键(id_author
) 参考users
(id_user
) 删除时不执行任何操作,更新时不执行任何操作;
修改表tutors_tag_relations
添加约束Tutors_Tag_Relations_ibfk_1
外键(id_tag
) 参考tags
(id_tag
) 删除时不执行任何操作,更新时不执行任何操作;
插入test
.users
(
id_user
,
name
,
surname
)
值(
NULL,“维维安”,“理查兹”
), (
NULL 、“萨钦”、“坦杜卡”
);
插入test
.users
(
id_user
,
name
,
surname
)
值(
NULL 、“唐”、“布拉德曼”
);
插入test
.tutor_details
(
id_tutor
,
id_user
)
值(
空,'52'
), (
空,'53'
);
插入test
.tutor_details
(
id_tutor
,
id_user
)
值(
空,'54'
);
插入test
.tags
(
id_tag
,
tag
)
值(
1、《维维安》
), (
2、“理查兹”
);
插入test
.tags
(id_tag
, tag
) VALUES (3, 'Sachin'), (4, 'Tendulkar');
插入test
.tags
(id_tag
, tag
) VALUES (5, '唐'), (6, '布拉德曼');
插入test
.learning_packs
(id_lp
, id_status
, id_author
, name
) VALUES ('1', '1', '52', '板球 1'), ('2', '2', '52', '板球 2');
插入test
.tags
(id_tag
, tag
) VALUES ('7', '板球'), ('8', '1');
插入test
.tags
(id_tag
, tag
)值('9','2');
插入test
.learning_packs_tag_relations
(id_tag
, id_tutor
, id_lp
)值('7','52','1'),('8','52','1');
插入test
.learning_packs_tag_relations
(id_tag
, id_tutor
, id_lp
) 值 ('7', '52', '2'), ('9', '52', '2');
=================================================== ===================================
关于新系统——
- 系统现在多了 4 个表 - 导师、用户(链接到tutor_details)、learning_packs、learning_packs_tag_relations
- 教师创建包 - 存储在tutorials_tag_relations中的教师的标签关系以及存储在learning_packs_tag_relations中的包的标签关系。
现在我想用相同的AND逻辑搜索learning_packs。帮助我修改以下查询,以便搜索包名称或导师的姓名、姓氏结果所有活动包(直接是那些包或由这些导师创建的包)。
=================================================== ==================================
选择 lp.*
来自 Learning_Packs AS lp
LEFT JOIN Learning_Packs_Tag_Relations AS lptagrels ON lp.id_lp = lptagrels.id_lp
LEFT JOIN Tutors_Tag_Relations as ttagrels ON lp.id_author = ttagrels.id_tutor
左连接 Tutor_Details AS td ON ttagrels.id_tutor = td.id_tutor
LEFT JOIN 用户作为 u on td.id_user = u.id_user
JOIN 标签为 (t.id_tag = lptagrels.id_tag) 或 (t.id_tag = ttagrels.id_tag)
其中 lp.id_status = 1 AND ( t.tag LIKE "%Vivian%" OR t.tag LIKE "%Richards%" )
按 lp.id_lp 分组 HAVING count(lp.id_lp) > 1 limit 0,20
如您所见,搜索“Cricket 1”会返回该包,但搜索 Vivian Richards 不会返回相同的包。
请帮忙