2012-01-12 64 views
0

我有一个用来存储商人报价(价格,评论,日期雇主接受这个报价......)的表格,积极/消极,评论,日期评级已提交,...)的每个商人。所以,一个商人可以有0..n的引号和0..n的评级。ruby​​/mysql:查询只返回一个用户,而不是许多用户

我想了解一下:

  • 多少收视率做了商人,当了他的报价是由雇主接受?

我目前的做法:

  • 首届查询(“引号”)是找出quoters的用户ID,并在此期限雇主接受了报价。

  • 第二个查询('ratings')在一个块内。对于每个商人ID,查询应获取与报价接受日期相同或相似的评级。

问题:

  • 第二届查询获取只能从一个用户的收视率,但它应该从约70得到用户的收视率。任何人都有一个想法,查询有什么问题?

代码:

#!/usr/bin/ruby 

require "mysql" 

begin 
    db_q = Mysql.real_connect("localhost", "root", "", "my_db") 
    quotes = db_q.query(" 
    SELECT q.user_id, q.accepted_at 
    FROM quotes q 
    INNER JOIN jobs j ON q.job_id = j.id 
    INNER JOIN categories_jobs cj ON j.id = cj.job_id 
    INNER JOIN categories c ON cj.category_id = c.id 
    INNER JOIN users u ON j.user_id = u.id 
    WHERE q.accepted_at IS NOT NULL 
    AND c.id = 8 
    ") 

    db_r = Mysql.real_connect("localhost", "root", "", "my_db") 
    quotes.each do |quote|  
    ratings = db_r.query("SELECT * FROM ratings WHERE assessee_id = #{quote[0]} AND CAST(created_at as DATE) <= '#{quote[1]}'") 
    ratings.each do |rating| 
     printf "%s, %s, %s, %s, %s, %s\n", rating[0], rating[2], rating[3], rating[4], rating[5], rating[6] 
    end 
    end 

    ratings.free 
    quotes.free 

rescue Mysql::Error => e 
    puts "Error code: #{e.errno}" 
    puts "Error message: #{e.error}" 
    puts "Error SQLSTATE: #{e.sqlstate}" if e.respond_to?("sqlstate") 
ensure 
    # disconnect from server 
    db_q.close if db_q 
    db_r.close if db_r 
end 

回答

0

,除非你真的需要做的原始SQL或可以使用库,一个ORM是非常有限的,像ActiveRecord真的可以削减的SQL发量你需要处理。

+0

这是MySQL,所以续集可以减少它。获取真正的@hebe,如果你不能写这个查询,请使用一些帮助。 – three 2012-01-12 14:27:41

+0

由于查询只返回1个用户的结果,我认为一个返回所有用户的解决方案并不遥远。 @three有关如何将它与续集剪下来的提示? – hebe 2012-01-12 14:41:40

+0

@Paul Rubel:我从制作中做了一个转储,试图用Sequel Pro对我的数据进行一些评估。这就是为什么我坚持原始的SQL到目前为止..我实际上从来没有使用Active Record除了Rails。 – hebe 2012-01-12 14:43:04