MySQL之前按顺序排序加上加号

时间:2015-10-31 09:36:15

标签: mysql join

经过几个小时的努力,我想我在这里寻求你的帮助。我的问题如下:

我有两张桌子。一个表包含一般事件数据,第二个表包含引用一般表的单个事件(可能有几个单个事件引用一个常规事件行)。

结构如下:

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;我得到了同样的错误。

为什么?或者更好的问题:什么是正确的查询?

提前多多感谢!

1 个答案:

答案 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