mysql - 具有来自第二个表的子查询范围的 SQL 查询表

标签 mysql sql sql-server sqlite

我有两个表,第一个表有两个范围,我用它来查询第二个表,我想在单个查询中执行此操作到目前为止,我有两个单独的查询,但似乎无法找出如何一起使用它们.

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/

相关文章:

mysql - 存储过程返回错误值?

sql-server - 我如何为这个 SQL 获得正确的锁?

mysql - varbinary(-1) 上的语法错误

mysql - mysql 客户端中的命令历史记录仅显示多行查询的最后一行

mysql - 2个来自一张表的外部连接

php - MySQL 将 IP 存储为 int 以获得更高的性能?

sql查询按类别删除

c# - 在 SQL 2005/2008 中转义双引号

sql-server - 用前导零填充字符串,使其在 SQL Server 2008 中为 3 个字符长

mysql - 如何仅按顺序加入第一条记录