Return 查询内含并集的查询结果
Return query result with union inside query
我在数据库中有 3 个 table 像这样
Table availability
availability_id | date | price | room_id | closed
-------------------------------------------------------
1 | 2017-01-24 | 75 | 8 | 0
2 | 2017-01-24 | 95 | 9 | 0
3 | 2017-01-25 | 80 | 73 | 0
4 | 2017-01-25 | 70 | 65 | 0
5 | 2017-01-26 | 85 | 42 | 0
6 | 2017-01-26 | 65 | 21 | 0
Table offer_day
plan_id | offer_id date | price | room_id | | closed
------------------------------------------------------------
1 | 12 | 2017-01-24 | 70 | 8 | 0
2 | 23 | 2017-01-24 | 75 | 9 | 0
3 | 12 | 2017-01-25 | 70 | 8 | 1
3 | 14 | 2017-01-25 | 70 | 8 | 0
4 | 34 | 2017-01-25 | 75 | 9 | 0
5 | 43 | 2017-01-25 | 80 | 73 | 0
6 | 54 | 2017-01-25 | 85 | 65 | 0
7 | 65 | 2017-01-26 | 75 | 42 | 0
8 | 44 | 2017-01-26 | 70 | 21 | 0
Table package_day
package_id | date | price | room_id | closed
--------------------------------------------------
1 | 2017-01-24 | 120 | 8 | 0
2 | 2017-01-24 | 125 | 9 | 0
3 | 2017-01-25 | 135 | 73 | 0
4 | 2017-01-25 | 130 | 65 | 0
5 | 2017-01-26 | 125 | 42 | 0
5 | 2017-01-26 | 120 | 21 | 0
我有这样的查询:
SELECT a.price
FROM availability a
WHERE a.closed = 0 AND a.date >= '2017-01-24' AND a.date <= DATE_SUB('2017-01-26', INTERVAL 1 DAY)
UNION
SELECT 0.price
FROM offer_day o
WHERE o.closed = 0 AND o.date >= '2017-01-24' AND o.date <= DATE_SUB('2017-01-26', INTERVAL 1 DAY)
UNION
SELECT p.price
FROM package_day p
WHERE p.closed = 0 AND p.date >= '2017-01-24' AND p.date <= DATE_SUB('2017-01-26', INTERVAL 1 DAY)
如果我 运行 该查询,我将获得 closed = 0
的所有行。正如您在 table offer_day
中所见,closed
.
列中的值为 1
如果相同 room_id
和相同 offer_id
中的列 close
中的任何行包含值 1,我不想显示结果。
例如,您可以在 table offer_day
中看到 room_id
8 有两个日期 '2017-01-24' 和 '2017-01-25' 以及两个 offer_id
12 和 14 在日期 '2017-01-25' 在 closed
和 offer_id
8 中有 1 个。我不想显示 room_id
8 和 offer_id
12 如果任何行包含值 1
我该怎么做?
谢谢。
您在评论中询问,如果关闭的记录为 1,那么您不想从 table 中获取任何记录。您可以进行子查询以检查您是否有任何不需要的值。
这是一个例子
SELECT a.price
FROM availability a
WHERE a.closed = 0 AND a.date >= '2017-01-24' AND a.date <= DATE_SUB('2017-01-26', INTERVAL 1 DAY) and a.closed NOT IN (select closed FROM availability WHERE closed = 1 AND date >= '2017-01-24' AND date <= '2017-01-26')
UNION
SELECT o.price
FROM offer_day o
WHERE o.closed = 0 AND o.date >= '2017-01-24' AND o.date <= DATE_SUB('2017-01-26', INTERVAL 1 DAY) and o.closed NOT IN (select closed FROM offer_day WHERE closed = 1 AND date >= '2017-01-24' AND date <= '2017-01-26')
UNION
SELECT p.price
FROM package_day p
WHERE p.closed = 0 AND p.date >= '2017-01-24' AND p.date <= DATE_SUB('2017-01-26', INTERVAL 1 DAY) and p.closed NOT IN (select closed FROM package_day WHERE closed = 1 AND date >= '2017-01-24' AND date <= '2017-01-26')
如果你不想要房间,你可以使用 blow 查询
SELECT a.price
FROM availability a
WHERE a.closed = 0 AND a.date >= '2017-01-24' AND a.date <= DATE_SUB('2017-01-26', INTERVAL 1 DAY) and a.room_id NOT IN (select room_id FROM availability WHERE closed = 1 AND date >= '2017-01-24' AND date <= '2017-01-26')
UNION
SELECT o.price
FROM offer_day o
WHERE o.closed = 0 AND o.date >= '2017-01-24' AND o.date <= DATE_SUB('2017-01-26', INTERVAL 1 DAY) and o.room_id NOT IN (select room_id FROM offer_day WHERE closed = 1 AND date >= '2017-01-24' AND date <= '2017-01-26')
UNION
SELECT p.price
FROM package_day p
WHERE p.closed = 0 AND p.date >= '2017-01-24' AND p.date <= DATE_SUB('2017-01-26', INTERVAL 1 DAY) and p.room_id NOT IN (select room_id FROM package_day WHERE closed = 1 AND date >= '2017-01-24' AND date <= '2017-01-26')
你可以看到如果 closed=1 我得到它的房间 ID 并且不在房间 ID 中使用它。
现在你得到答案了吗?
我在数据库中有 3 个 table 像这样
Table availability
availability_id | date | price | room_id | closed
-------------------------------------------------------
1 | 2017-01-24 | 75 | 8 | 0
2 | 2017-01-24 | 95 | 9 | 0
3 | 2017-01-25 | 80 | 73 | 0
4 | 2017-01-25 | 70 | 65 | 0
5 | 2017-01-26 | 85 | 42 | 0
6 | 2017-01-26 | 65 | 21 | 0
Table offer_day
plan_id | offer_id date | price | room_id | | closed
------------------------------------------------------------
1 | 12 | 2017-01-24 | 70 | 8 | 0
2 | 23 | 2017-01-24 | 75 | 9 | 0
3 | 12 | 2017-01-25 | 70 | 8 | 1
3 | 14 | 2017-01-25 | 70 | 8 | 0
4 | 34 | 2017-01-25 | 75 | 9 | 0
5 | 43 | 2017-01-25 | 80 | 73 | 0
6 | 54 | 2017-01-25 | 85 | 65 | 0
7 | 65 | 2017-01-26 | 75 | 42 | 0
8 | 44 | 2017-01-26 | 70 | 21 | 0
Table package_day
package_id | date | price | room_id | closed
--------------------------------------------------
1 | 2017-01-24 | 120 | 8 | 0
2 | 2017-01-24 | 125 | 9 | 0
3 | 2017-01-25 | 135 | 73 | 0
4 | 2017-01-25 | 130 | 65 | 0
5 | 2017-01-26 | 125 | 42 | 0
5 | 2017-01-26 | 120 | 21 | 0
我有这样的查询:
SELECT a.price
FROM availability a
WHERE a.closed = 0 AND a.date >= '2017-01-24' AND a.date <= DATE_SUB('2017-01-26', INTERVAL 1 DAY)
UNION
SELECT 0.price
FROM offer_day o
WHERE o.closed = 0 AND o.date >= '2017-01-24' AND o.date <= DATE_SUB('2017-01-26', INTERVAL 1 DAY)
UNION
SELECT p.price
FROM package_day p
WHERE p.closed = 0 AND p.date >= '2017-01-24' AND p.date <= DATE_SUB('2017-01-26', INTERVAL 1 DAY)
如果我 运行 该查询,我将获得 closed = 0
的所有行。正如您在 table offer_day
中所见,closed
.
如果相同 room_id
和相同 offer_id
中的列 close
中的任何行包含值 1,我不想显示结果。
例如,您可以在 table offer_day
中看到 room_id
8 有两个日期 '2017-01-24' 和 '2017-01-25' 以及两个 offer_id
12 和 14 在日期 '2017-01-25' 在 closed
和 offer_id
8 中有 1 个。我不想显示 room_id
8 和 offer_id
12 如果任何行包含值 1
我该怎么做?
谢谢。
您在评论中询问,如果关闭的记录为 1,那么您不想从 table 中获取任何记录。您可以进行子查询以检查您是否有任何不需要的值。 这是一个例子
SELECT a.price
FROM availability a
WHERE a.closed = 0 AND a.date >= '2017-01-24' AND a.date <= DATE_SUB('2017-01-26', INTERVAL 1 DAY) and a.closed NOT IN (select closed FROM availability WHERE closed = 1 AND date >= '2017-01-24' AND date <= '2017-01-26')
UNION
SELECT o.price
FROM offer_day o
WHERE o.closed = 0 AND o.date >= '2017-01-24' AND o.date <= DATE_SUB('2017-01-26', INTERVAL 1 DAY) and o.closed NOT IN (select closed FROM offer_day WHERE closed = 1 AND date >= '2017-01-24' AND date <= '2017-01-26')
UNION
SELECT p.price
FROM package_day p
WHERE p.closed = 0 AND p.date >= '2017-01-24' AND p.date <= DATE_SUB('2017-01-26', INTERVAL 1 DAY) and p.closed NOT IN (select closed FROM package_day WHERE closed = 1 AND date >= '2017-01-24' AND date <= '2017-01-26')
如果你不想要房间,你可以使用 blow 查询
SELECT a.price
FROM availability a
WHERE a.closed = 0 AND a.date >= '2017-01-24' AND a.date <= DATE_SUB('2017-01-26', INTERVAL 1 DAY) and a.room_id NOT IN (select room_id FROM availability WHERE closed = 1 AND date >= '2017-01-24' AND date <= '2017-01-26')
UNION
SELECT o.price
FROM offer_day o
WHERE o.closed = 0 AND o.date >= '2017-01-24' AND o.date <= DATE_SUB('2017-01-26', INTERVAL 1 DAY) and o.room_id NOT IN (select room_id FROM offer_day WHERE closed = 1 AND date >= '2017-01-24' AND date <= '2017-01-26')
UNION
SELECT p.price
FROM package_day p
WHERE p.closed = 0 AND p.date >= '2017-01-24' AND p.date <= DATE_SUB('2017-01-26', INTERVAL 1 DAY) and p.room_id NOT IN (select room_id FROM package_day WHERE closed = 1 AND date >= '2017-01-24' AND date <= '2017-01-26')
你可以看到如果 closed=1 我得到它的房间 ID 并且不在房间 ID 中使用它。 现在你得到答案了吗?