I have an intermediate table representing a many to many relationship between users and songs. Users can like/dislike many songs, and songs can be liked/disliked by many users. I am trying to retrieve a list of 30 songs, that can be any songs except for songs that have been disliked by the user.
Here's a simplified version of the 3 tables: #Table 1: db.define_table('auth_user', Field('id') ) #Table 2: db.define_table('songs', Field('id') ) #Table 3 (intermediate) db.define_table('likes_and_dislikes', Field('username', 'reference auth_user'), Field('songname','reference songs'), Field('like_score', 'integer') ) Originally I had made 2 database selects to accomplish this, first finding all the songs that have been disliked by the user (this can be a very high number), and then querying songs to avoid the disliked songs: disliked_ids = [] dislike_query = (db.likes.username==auth.user.id) & (db.likes.like_score==-1 ) #score of -1 represents a dislike disliked_songs = db(dislike_query).select().as_list() for row in disliked_songs: disliked_ids.append(row['songname']) query = (~db.songinfo.id.belongs(disliked_ids)) song_rows = db(pre_query).select(orderby='<random>', limitby=(0,30)) I'm sure there's a more efficient way to do this, and I have been looking into left joins and inner joins to accomplish everything in one database select. My understanding of joins get a little hazy once there needs to be more than join performed, any help is appreciated! -- --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to web2py+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.