我正在尝试与下面的2个查询相交,但是我收到了这个错误:
ProgrammingError :( ProgrammingError)(1064,“你的错误 SQL语法;查看与MySQL服务器对应的手册 在'INTERSECT SELECT附近使用正确语法的版本 user_checkpoint.id AS user_checkpoint_id,user_checkpoint.user_'at 第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检查点ON checkpoint.id = user_checkpoint.checkpoint_id INNER JOIN用户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用户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检查点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 :(得分: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()]