我发现很难学会如何在mySQL中构建更复杂的查询。
希望通过这个问题,我可以更深入地了解如何在单个查询中开发多级查询。
我有一个标记系统。
tbl1: ktbridge
ktbridge_id
threads_id
keywords_id
tbl2: threads
threads_id
subject
etc
tbl3: keywords
keywords_id
keyword
related_id
以上是我目前的设置。
对于数据,我有:
INSERT INTO `ktbridge` (`ktbridge_id`, `threads_id`, `keywords_id`) VALUES
(1, 1, 9);
INSERT INTO `keywords` (`keyword_id`, `keyword`, `related_id`) VALUES
(5, 'Sports', 0),
(6, 'Baseball', 5),
(7, 'football', 5),
(8, 'Curling', 5),
(9, 'Pitchers', 6),
(10, 'Catchers', 6),
INSERT INTO `threads` (`threads_id`, `subject`, `body`, `users_id`, `timestamp`, `replystamp`) VALUES
(1, 'Sports - Baseball - Pitchers - Subject', 'Sports - Baseball - Pitchers - Body', 1, '2013-01-09 14:09:40', '0000-00-00 00:00:00');
此处的目标是返回与提供的keyword_id相关的线程。
困难的部分是,如果选择“棒球”,它将返回棒球线程。但是,如果选择“sports”,它将根据keywords
表中的“related_id”返回其下面的所有线程。所以它将返回基于棒球,足球和冰壶的所有线程。
这是可能的吗?或者它需要多个查询?提前谢谢!
答案 0 :(得分:1)
它确实需要多个查询,但您可以嵌套它们并从内部选择中进行选择。我认为以下内容应该有效(或至少让你开始)。请注意,这是MySQL,但应该可以移植到其他RDBM系统:
SELECT * FROM `threads` WHERE `threads`.`threads_id` IN (
SELECT `threads_id` FROM `ktbridge` WHERE `ktbridge`.`keywords_id` IN (
SELECT `keywords_id` FROM `keywords`
WHERE `keywords`.`id` = 5 OR `keywords`.`related_id` = 5
)
);