0

我发现很难学习如何在 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');

这里的目标是返回与提供的关键字 ID 相关的线程。

困难的部分是,如果选择了“棒球”,它会返回棒球线程。但是,如果选择了“sports”,它会根据keywords表中的“related_id”返回它下面的所有线程。因此它将返回所有基于棒球、足球和冰壶的线程。

这是一种可能吗?还是需要多次查询?提前致谢!

4

1 回答 1

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

“IN”的 MySQL 文档参考

于 2013-01-09T17:51:14.990 回答