Mysql查询左连接访问变量

时间:2013-07-05 18:14:55

标签: mysql join repeat

如果有人可以帮我这个,我有这些桌子我希望在两个日期之间进行所有预订,并知道其中任何一个是由别人完成还是失败。

表:登记

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

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

这里有些图片希望变得清晰我无法解释我想要的东西

这是预订 Booking table

这是失败

Fail table

我不能放2个以上的链接,这就是为什么这两个链接就像文本一样 所以,当我想在某个约会时预订时,会发生什么呢

s16.postimg.org/l00k1math/image.jpg

我想要做的是

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

但不仅仅是用id 1预订我不会是b.id = un.booking_id然后如果有记录未能出现在最后一张图片上

感谢您的耐心

1 个答案:

答案 0 :(得分: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)
)

首先从生成的 a 表中进行选择,然后将其与预订表连接起来。一旦你有两个加入,很容易加入基于a.showdateb.id字段的任何其他表。

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