将多个mySQL查询放入一个复杂的查询中

时间:2013-01-09 17:19:05

标签: mysql

我发现很难学会如何在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”返回其下面的所有线程。所以它将返回基于棒球,足球和冰壶的所有线程。

这是可能的吗?或者它需要多个查询?提前谢谢!

1 个答案:

答案 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
    )
  );

MySQL doc reference for "IN"