0

如果有人可以帮我解决这个问题,我有这些桌子而且我想在两个日期之间获得所有预订,并知道其中任何一个是由其他人完成的还是失败的。

表:预订

id | date     |  date_end   | repeat | day_of_week | user_id | price
---------------------------------------------------------------------
1   2013-07-01   0000-00-00   1        3             1         20
2   2013-07-16   0000-00-00   1       -1             1         10

表:Bookings_done_by_other

id | date     | user_id   | booking_id
---------------------------------
1   2013-07-01  2           2
2   2013-07-13  2           2

表:Bookings_fail

id | date     | booking_id
---------------------------
1   2013-07-01  2
2   2013-07-11  2

表:理货

id
--
1
....
500

这是我的查询,它运行良好,但我无法用它来给我想要的一切。

SELECT f.date as fail, b.id, b.date, a.showdate, DATEDIFF(b.date, a.showdate) AS diff
FROM  bookings as b
LEFT JOIN bookings_fail f ON (b.id = f.booking_id and DATE(f.date) = DATE(a.showdate) )
,
(
SELECT DATE_ADD('2013-07-01 00:00:00',INTERVAL Id DAY) as showdate
FROM `tally` 
WHERE (DATE_ADD('2013-07-01 00:00:00',INTERVAL Id DAY) <= '2013-07-20 00:00:00')
ORDER BY Id ASC
)  a 
WHERE 
MOD(DATEDIFF(b.date, a.showdate), b.repeat) = 0
AND 
DATE(a.showdate)>= DATE(b.date)

什么时候是这样的抛出错误,在左连接中看不到 a.showdate,当我将左连接移动到“a”表旁边时抛出看不到 b.id 的错误,所以有什么方法可以让这个连接工作吗?

我想得到这样的结果

id | showdate | fail | by_other | 
-----------------------------
1   2013-07-01  NULL    2
2   2013-07-01  1       NULL     //Or date
1   2013-07-03  NULL    NULL
1   2013-07-04  NULL    NULL
1   2013-07-05  NULL    NULL
1   2013-07-06  NULL    NULL
.............................
1   2013-07-20  NULL    NULL

对不起,如果我的英语不太好,并提前感谢所有可以提供帮助的人。

这里有一些图片希望越来越清楚我无法正确解释我想要什么

这是预订 预订表

这是失败

失败表

我不能放置超过 2 个链接,这就是为什么这两个链接就像文本一样,所以当我想获得某个日期的预订时会发生什么我这样做

s16.postimg.org/l00k1math/image.jpg

我想做的是

s12.postimg.org/5o5hbnmdp/image.jpg

但不仅是使用 id 1 进行预订,我不会成为 b.id = un.booking_id ,然后如果有记录无法显示最后一张图片

谢谢你的耐心

4

1 回答 1

1

我想我终于明白你想要做什么了。我的建议是像这样格式化您的查询:

SELECT b.id, a.showdate, f.id as fail, o.id as other
FROM (
  SELECT DATE_ADD('2013-07-01 00:00:00',INTERVAL Id DAY) as showdate
  FROM `tally` 
  WHERE (DATE_ADD('2013-07-01 00:00:00',INTERVAL Id DAY) <= '2013-07-20 00:00:00')
  ORDER BY Id ASC
) a
LEFT JOIN Bookings b ON (
  MOD(DATEDIFF(b.date, a.showdate), b.repeat) = 0 AND 
  DATE(a.showdate)>= DATE(b.date)             
)
LEFT JOIN Bookings_fail f ON (
  b.id = f.booking_id AND 
  DATE(f.date) = DATE(a.showdate) 
)
LEFT JOIN Bookings_done_by_other o ON (
  b.id = o.booking_id AND 
  DATE(o.date) = DATE(a.showdate)
)

您首先从生成表中进行选择,然后将其与Bookings表连接。一旦你加入了这两个,就很容易根据a.showdateb.id字段加入任何其他表。

我创建了一个 SQL Fiddle 示例,或多或少基于您的数据,因此您可以了解它是如何工作的。http://sqlfiddle.com/#!2/7e151/1

于 2013-07-05T21:44:33.593 回答