【问题标题】:Return query result with union inside query使用联合查询返回查询结果
【发布时间】:2017-01-12 08:41:35
【问题描述】:

我在数据库中有 3 个这样的表

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

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

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 的所有行。正如您在表 offer_day 中看到的那样,closed 列中的值为 1。

如果同一 room_id 和同一 offer_id 中的列 close 中的任何行包含值 1,我不想显示结果。

例如,您可以在表 offer_day 中看到 room_id 8 有两个日期 '2017-01-24' 和 '2017-01-25' 以及两个 offer_id 12 和 14 在日期 '2017- 01-25' 在 closedoffer_id 8 中有 1。如果有任何行包含值 1,我不想显示 room_id 8 和 offer_id 12

我该怎么做?

谢谢。

【问题讨论】:

  • 你有一个条件 -> x.closed = 0 ,在你的查询中你会得到所有已经关闭=0的记录
  • 是的,我知道。但是,我希望在我输入的日期范围内,如果关闭列中的值为 1 我不想显示所有记录@RafaelShkembi
  • 您的查询有什么问题?输出是什么?你期待什么输出?
  • 如果coloumn中的值1,我不想显示所有记录关闭。 @shmosel
  • 没有?你想要一个空的结果集?

标签: php mysql codeigniter codeigniter-3


【解决方案1】:

如果你不想要房间,你可以使用 bleow 查询

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 中使用它。 现在你有答案了吗?

【讨论】:

  • 我只是将coloumn offer_id 更改为plan_id 并将offer_id 添加为新coloumn。请再次查看我的问题。
  • 我已经给出了想法,现在您可以按照自己的方式进行新查询
【解决方案2】:

您在 cmets 中询问如果关闭的记录为 1,那么您不想从表中获取任何记录。你可以做一个子查询来检查你是否有任何你不想要的值。 这是一个例子

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

【讨论】:

  • 如果有任何数据 o.closed =1 则可能不起作用,那么在给定的数据范围内不要带任何单个数据事件 o.closed =0 其他值
  • @krishnpatel 是的,我知道,但是 OP 询问说他想获取所有已关闭 = 0 的记录,但如果表中存在已关闭 = 1 的记录,则不会获取任何结果。我忘记了子查询中的日期过滤器我将更新我的答案
  • @Antonio 现在我明白了。请等待几分钟,我将更新我的答案
  • @RafaelShkembi 你现在能更新你的答案吗,他想要房间明智
  • 你回答完了吗?
猜你喜欢
  • 2016-08-14
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
相关资源
最近更新 更多