2011-04-17 5 views
1

J'essaie de sélectionner toutes les discussions récentes répondues par l'utilisateur. Mais la requête suivante ne fonctionne pas. Renvoie 0 entrées Je suis nouveau à SQL, je suppose qu'il y a quelque chose de mal dans mon utilisation de "IN". S'il vous plaît aider ce dépannage:Problème de requête SQLite

SELECT * FROM discussions 
    WHERE discussable_id IN 
    (SELECT commentable_id FROM comments 
    WHERE commentable_type = 'Discussion' AND user_id = 1); 

aussi, si je veux trier la requête ci-dessus par le comment.created_at? Comment je fais ça? De plus, que faire si je veux également inclure toutes les discussions créées par l'utilisateur, et aussi trier toute la requête par la dernière activité (pourrait être discussion.created_at ou comment.created_at). Je suis dans les rails en passant. J'ai essayé de résoudre cela pendant quelques heures. J'apprécierais vraiment toute contribution. Merci beaucoup! UPDATE2: On dirait que je devrais remplacer discussable_id dans la requête avec "id", l'avez-vous repéré? :) un tel problème fastidieux. Maintenant, comment puis-je commander les discussions retournées par comment.created_at? Dois-je ouvrir une autre question?

Update1: Désolé, voici le activerecord:

# Table name: discussions 
# 
# id    :integer   not null, primary key 
# title   :string(255)  not null 
# content   :text(255)  not null 
# created_at  :datetime 
# updated_at  :datetime 
# user_id   :integer 
# discussable_id :integer 
# discussable_type :string(255) 
class Discussion < ActiveRecord::Base 
    has_many :comments, :as => :commentable, :dependent => :destroy 
    #this is the scope that I'm having trouble with: 
    scope :user_replied_group_discussions, lambda {|user| replied_by(user) } 

    def last_reply 
    if self.comments.any? 
     self.comments.last.created_at 
    else 
     self.created_at 
    end 
    end 
    private 
    def self.replied_by(user) 
     discussion_ids = %(SELECT commentable_id FROM comments 
        WHERE commentable_type = 'Discussion' AND user_id = :user_id) 
     where("discussable_type = 'Group' AND discussable_id IN (#{discussion_ids}) ", 
      { :user_id => user }) 
    end 
end 

# Table name: comments 
# 
# id    :integer   not null, primary key 
# content   :text 
# created_at  :datetime 
# updated_at  :datetime 
# commentable_id :integer 
# commentable_type :string(255) 
# user_id   :integer 
# 

class Comment < ActiveRecord::Base 

    belongs_to :commentable, :polymorphic => true 
    belongs_to :user 

end 

Quoi qu'il en soit, j'ai essayé d'exécuter la requête SQL dans la console sqlite3, retourne 0 entrée. Merci!

+0

où est ActiveRecord ici? –

+1

est dicussable_id et commentable_id sont liés? veuillez afficher la structure des discussions et le tableau des commentaires. et aussi mentionner comment ils sont liés? – Ravin

Répondre

0

Tenir compte:

SELECT d.* FROM discussions d 
JOIN comments c 
ON d.discussable_id = c.commentable_id 
WHERE c.commentable_type = 'Discussion' 
AND c.user_id = 1 

Cela montre la même relation que d'essayer d'établir le IN. Si cela renvoie zéro résultat, eh bien, c'est la réponse ;-) Peut-être que les relations ne sont pas comme prévu? (Il semble étrange d'avoir d.discussable_id = c.commentable_id.)

Bonne codage.

+0

Vous pouvez essayer 'LEFT JOIN' au lieu de' JOIN'. –

+0

Merci! J'ai compris pourquoi: voir le UPDATE2, mais maintenant je veux commander des discussions par comment.created_at. Devrais-je ouvrir une autre question? – randomor

+0

J'ai ouvert une autre question ici, vous êtes invités à aider: http://stackoverflow.com/questions/5695459/sql-query-order-problem – randomor