我有两个表,第一个表有两个范围,我用它来查询第二个表,我想在单个查询中执行此操作到目前为止,我有两个单独的查询,但似乎无法找出如何一起使用它们.
This is table one, with the ranges that are from_book_id, from_chapter, to_book_id and to_chapter.
这是我用来获取所需行的查询:
SELECT * FROM plans WHERE plans.day = 1 AND plans.plan_id = 1
This is the second table with the data to filter with tables one range.
我用它从这个表中得到想要的结果
SELECT verse.* FROM verse WHERE (verse.book_id >= 1 AND verse.book_id <= 1) AND (verse.chapter >= 1 AND verse.chapter <= 5))
为了澄清,我需要使用第一个表的结果范围作为第二个表的查询:
SELECT t1.* FROM t1 WHERE (t1.book_id >= t2.from_book_id AND t1.book_id <= t2.to_book_id) AND (t1.chapter >= t2.from_chapter AND t1.chapter <= t2.to_chapter))
我希望这个解释足够清楚,我提前感谢大家。
编辑
我似乎在查询中遇到了一些特殊情况,尽管当我遇到如下范围时它工作得很好:
from_book_id:1, from_chapter:1, to_book_id:1, to_chapter:5
该范围返回所需的结果,但是当范围从一本书变为另一本书时,如下所示:
from_book_id:1, from_chapter:5, to_book_id:2, to_chapter:5
这意味着它需要获取从第 1 本书第 5 章到第 1 本书最后一章的所有内容,然后继续第 2 本书直到第 5 章。
这些情况会破坏查询并返回 null,如果您能帮我解决这个问题,我将不胜感激。
再次感谢!
最佳答案
试试这个:希望它能为您提供您想要的准确输出。它将根据plans
表条件查询verse
表数据
SELECT * --you can shorten the columns by defining the required column names
FROM plans p
INNER JOIN verse v ON v.book_id BETWEEN p.from_book_id AND p.to_book_id
AND v.chapter BETWEEN p.from_chapter AND p.to_chapter
WHERE p.day = 1 AND p.plan_id = 1
对于更新的需求:我们可以使用UNION
SELECT * --you can shorten the columns by defining the required column names
FROM plans p
INNER JOIN verse v ON v.book_id = p.from_book_id
AND v.chapter >= p.from_chapter
WHERE p.day = 1 AND p.plan_id = 1
UNION
SELECT *
FROM plans p
INNER JOIN verse v ON v.book_id = p.to_book_id
AND v.chapter <= p.to_chapter
WHERE p.day = 1 AND p.plan_id = 1
关于mysql - 具有来自第二个表的子查询范围的 SQL 查询表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47603490/