2012-05-20 29 views
0

我想相交低于2次的查询,但我得到这个错误:这个SQLAlchemy相交有什么问题?

ProgrammingError: (ProgrammingError) (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INTERSECT SELECT user_checkpoint.id AS user_checkpoint_id, user_checkpoint.user_' at line 4") 'SELECT anon_1.user_checkpoint_id AS anon_1_user_checkpoint_id, anon_1.user_checkpoint_user_id AS anon_1_user_checkpoint_user_id, anon_1.user_checkpoint_checkpoint_id AS anon_1_user_checkpoint_checkpoint_id, anon_1.user_checkpoint_date_added AS anon_1_user_checkpoint_date_added \nFROM (SELECT user_checkpoint.id AS user_checkpoint_id, user_checkpoint.user_id AS user_checkpoint_user_id, user_checkpoint.checkpoint_id AS user_checkpoint_checkpoint_id, user_checkpoint.date_added AS user_checkpoint_date_added \nFROM user_checkpoint INNER JOIN checkpoint ON checkpoint.id = user_checkpoint.checkpoint_id INNER JOIN user AS user_1 ON user_checkpoint.user_id = user_1.id INNER JOIN facebook_user AS facebook_user_1 ON facebook_user_1.id = user_1.facebook_user_id INNER JOIN friend_connection ON friend_connection.fb_user_to = facebook_user_1.id INNER JOIN facebook_user ON facebook_user.id = friend_connection.fb_user_from INNER JOIN user ON user.facebook_user_id = facebook_user.id \nWHERE user.id != %s AND checkpoint.creator = user_1.id AND checkpoint.demo = %s INTERSECT SELECT user_checkpoint.id AS user_checkpoint_id, user_checkpoint.user_id AS user_checkpoint_user_id, user_checkpoint.checkpoint_id AS user_checkpoint_checkpoint_id, user_checkpoint.date_added AS user_checkpoint_date_added \nFROM user_checkpoint INNER JOIN checkpoint ON checkpoint.id = user_checkpoint.checkpoint_id \nWHERE checkpoint.creator != %s AND checkpoint.demo = %s) AS anon_1 ORDER BY checkpoint.date_created DESC \n LIMIT %s' (185L, 0, 185L, 0, 1)

#get checkpoints from users with friends 
    FriendUserCheckpoint, FriendFacebookUser, FriendUser = aliased(UserCheckpoint), aliased(FacebookUser), aliased(User) 
    q = (db.session.query(UserCheckpoint). 
     join(Checkpoint, Checkpoint.id == UserCheckpoint.checkpoint_id). 
     join(FriendUser, FriendUser.id == UserCheckpoint.user_id). 
     join(FriendFacebookUser, FriendFacebookUser.id == FriendUser.facebook_user_id). 
     join(FriendConnection, FriendConnection.fb_user_to == FriendFacebookUser.id). 
     join(FacebookUser, FacebookUser.id == FriendConnection.fb_user_from). 
     join(User, User.facebook_user_id == FacebookUser.id). 
     filter(User.id != user_obj.id). 
     filter(Checkpoint.creator == FriendUser.id). 
     filter(Checkpoint.demo == False) 
     ) 

    #get checkpoints from users without friends 
    p = (db.session.query(UserCheckpoint). 
     join(Checkpoint, Checkpoint.id == UserCheckpoint.checkpoint_id). 
     filter(Checkpoint.creator != user_obj.id). 
     filter(Checkpoint.demo == False) 
     ) 

    w = q.intersect(p) 

    return w.order_by(desc(Checkpoint.date_created)).limit(limit).all() 

我怎样才能解决呢?谢谢!

回答

0

您查询的问题是order_by:您尝试按不在您的查询中的列进行排序。你得到的SQL查询如下所示:

SELECT anon_1.col1, anon_1.col2, ... 
FROM (
    SELECT <UserCheckpoint columns> 
    FROM UserCheckpoint 
    ... (joins, filters etc) 


    INTERSECT 

    SELECT <UserCheckpoint columns> 
    FROM UserCheckpoint 
    ... (joins, filters etc) 
) anon_1 
ORDER BY checkpoint.date_created DESC -- @note: here is the problem 

正如你所看到的,外部查询没有在源表的列表checkpoint表(只包含一个anon_1)。删除order_by,我假设你的查询将起作用。

如果需要ORDER_BY,然后更改查询也返回date_created列,结果排序,并摆脱该列的更高版本:

q = (db.session.query(UserCheckpoint, Checkpoint.date_created). 
... 
p = (db.session.query(UserCheckpoint, Checkpoint.date_created). 
... 
return [uc for (uc, _) in w.order_by(desc(Checkpoint.date_created)).limit(limit).all()] 
+0

GR8的回答,谢谢! – nubela