我有两张桌子。一个表包含一般事件数据,第二个表包含引用一般表的单个事件(可能有几个单个事件引用一个常规事件行)。
结构如下:
1。一般事件表" 事件":
id | club_id | date_created | description | imageLink | ....
2。单一事件表:" events_single "
id | events_id (id from events table) | valid_from | valid_until
所有时间戳都是unix时间戳
所以我想得到的是具有特定club_id的俱乐部未来最近的单项赛事。单个事件行应与相应的事件行连接。
通过以下链接,我设法获得所有俱乐部最近的单项活动: MySQL order by before group by
查询如下所示:
SELECT p1 . *
FROM events_single p1
INNER JOIN (
SELECT min( valid_from ) AS firstEvent, events_id
FROM events_single
WHERE events_single.valid_from >= UNIX_TIMESTAMP()
GROUP BY events_id
)p3 ON p1.events_id = p3.events_id
AND p1.valid_from = p3.firstEvent
ORDER BY p1.valid_from ASC
这将返回例如:
id |events_id |valid_from|valid_until
4 |1 |1446706800|1446793200
39 |7 |1446966000|1447052400
14 |4 |1447311600|1447398000
问题是我现在需要再次使用events表加入此表,以便只获取某个俱乐部的单个事件。
E.g。如果一般事件表是
id | club_id | date_created | ....
1 | 1 | 1446793200 | .... <------
2 | 2 | 1456793235 | ....
3 | 5 | 1458735234 | ....
4 | 1 | 1458783425 | .... <------
5 | 2 | 1458953256 | ....
6 | 4 | 1461983283 | ....
7 | 5 | 1461993452 | ....
我现在想要获得club_id = 1的所有单个事件,并且应该返回两个加入的表:
id |events_id |valid_from|valid_until|club_id | date_created | ....
4 |1 |1446706800|1446793200 |1 | 1446793200 | ....
14 |4 |1447311600|1447398000 |1 | 1458783425 | ....
我尝试了以下查询:
SELECT p1.*, p2.*
FROM events_single p1, events p2
INNER JOIN (
SELECT min( valid_from ) AS firstEvent, events_id
FROM events_single
WHERE events_single.valid_from >= UNIX_TIMESTAMP()
GROUP BY events_id
)p3 ON p1.events_id = p3.events_id
AND p1.valid_from = p3.firstEvent
WHERE p2.club_id = 1
ORDER BY p1.valid_from ASC
但是我收到了一个错误:
#1054 - Unknown column 'p1.events_id' in 'on clause'
如果我更换&#39; p1.events_id &#39;使用&#39; events_single.events_id &#39;我得到了同样的错误。
为什么?或者更好的问题:什么是正确的查询?
提前多多感谢!
答案 0 :(得分:1)
您似乎需要再次加入Events Table。在其他一些方面,别名p1在ON子句中不可见,因为您再次添加了事件p2。请尝试以下查询,以解决您的问题。
SELECT p1.*, p2.*
FROM events_single p1
INNER JOIN (
SELECT min( valid_from ) AS firstEvent, events_id
FROM events_single
WHERE events_single.valid_from >= UNIX_TIMESTAMP()
GROUP BY events_id
)p3 ON (p1.events_id = p3.events_id
AND p1.valid_from = p3.firstEvent)
INNER JOIN
events p2 ON (p2.id = p3.event_id)
WHERE p2.club_id = 1
ORDER BY p1.valid_from ASC
我们可以按如下方式优化上述查询
SELECT events.*, es_tmp.*
FROM events
INNER JOIN (
SELECT min( valid_from ) AS firstEvent, events_id
FROM events_single
WHERE events_single.valid_from >= UNIX_TIMESTAMP()
GROUP BY events_id
)es_tmp ON (events.id = es_tmp.events_id)
WHERE events.club_id = 1
ORDER BY es_tmp.firstEvent ASC