打印

请问如何实现多表查询?

请问如何实现多表查询?

假设有2个表
表1:
Category:
id
category_name

表2:
Article
article_id
cat_id
article

如果要做到这样的多表查询 :
select * from article inner join category on article.cat_id = category.id where category.id=1

如果要实现上面的查询请我在php?name=rails" onclick="tagshow(event)" class="t_tag">rails里面怎么实现啊?还用find方法???? 请指点。多谢

TOP

一般情况下article_id应该命名为id,cat_id应该是category_id

class Category < ActiveRecord::Base
  has_many :articles,
           :foreign_key => "cat_id"
end

class Article < ActiveRecord::Base
  self.primary_key = "article_id"
  belongs_to :category,
             :foreign_key => "cat_id"
end

Category.find(1).articles


-----------------------------
1. > rails test
2. > mysqladmin -u root create test_development
3. 拷贝category.rb,article.rb到models; 001_create_test.rb,002_add_test_data.rb到migrate
4. > rake db:migrate
5. > ruby script/console
6. >> Category.find(1).articles

[ 本帖最后由 5swords 于 2008-5-23 16:10 编辑 ]
附件: 您所在的用户组无法下载或查看附件

TOP

如果改了model, console里没反应的话, 重启一下console试试.
问题里的sql不太好, 实际上rails是直接执行select * from articles where (articles.cat_id = 1), 不需要连接.
我觉得找一个category_name = 'xxx'的所有articles比较好.
对应的sql应该是

select 
  * 
from 
  articles 
  inner join categories on articles.article_id = categories.id
where 
  categoties.category_name = "rails"
;


对应的rails语句A
Category.find(:first, :conditions => {:category_name => "rails"}).articles
-->
#实际上是两条sql (参考log/development.log)

SELECT * FROM categories WHERE (categories.`category_name` = 'rails') LIMIT 1
SELECT * FROM articles WHERE (articles.cat_id = 3)


对应的rails语句B (预先读取子记录, AWDWR_CN_V2 Page358)
Category.find(:first, :conditions => {:category_name => "rails"}, :include => :articles).articles
-->

SELECT categories.id            AS t0_r0,
       categories.category_name AS t0_r1,
       articles.article_id      AS t1_r0,
       articles.cat_id          AS t1_r1,
       articles.article         AS t1_r2
  FROM categories
  LEFT OUTER JOIN articles ON articles.cat_id = categories.id
 WHERE (categories.category_name = 'rails')


有两个问题如下:
1. 这儿直接使用了左连接, 不知道右连接和内连接的话, rails能不能直接处理, 还是要写sql.
貌似AWDWR里没有特别讲到左右连接的问题. 就这个例子, 改为到articles是内连接, 相关的文件怎么改.

2. 这儿和想象的sql还有另外一个区别, 就是categories连接articles, 反过来Article.find(...)就不会写了.

各位看到过相关的文章或是有什么指点吗?

[ 本帖最后由 5swords 于 2008-5-23 17:52 编辑 ]

TOP

可能是我多虑了, 左右连接, 表现在rails里

如这儿的例子, 一个article没有category的话, 那么article.category == nil也很正常.

TOP

你好,我按照上面的做了,得到的错误是
undefined method `articles' for Category:Class

我在建立表的外键的时候失败了,表都建好了也有数据,是不是外键的问题?上面的错误把articles这个对象看成是方法了。请问如何解决?

TOP

回复 5# 的帖子

为什么会失败呢? 可能会有关系的.

migrate里的版本加上去再执行一下,把失败的句子贴上来看看.

-----------
我把Category改成下面的, 就出来你写的错误了. 如果Category.find(1)没问题的话, 应该就是category.rb的问题. 改了个文件后console最好要重启一下.

class Category < ActiveRecord::Base
 #has_many :articles,
 #     :foreign_key => "cat_id"
end

[ 本帖最后由 5swords 于 2008-5-23 18:23 编辑 ]

TOP

可能我调用的方式错了。
你最后的语句是:Category.find(1).articles 
我写的是:
@article = Category.find(1).articles 
puts "article id="+ String(@article.article_id) 是不是我调用的方式错了啊?
我没输出导网页上,但是在网页上面可以看到错误。

TOP

当我这么写的时候是可以用的:
@category = Category.find(1)
puts @category.id.to_s
category的值可以调用,但是用上面方法调用articles表的时候就出现我说的错误了

TOP

搞定了,原来返回的数组。我真是笨啊。哈哈。多谢你的例子了啊

TOP

2008-11-22 19:31 Crawled by CCBot/1.0 (+http://www.commoncrawl.org/bot.html) @38.103.63.61