我想在两个表之间进行内连接
访问表已
报告表有
每次访问都有很多报告,我想选择具有指定访问目标的所有报告
我这样做,但它没有用
$db = Zend_Db_Table::getDefaultAdapter();
$select = $db->select();
$rows = $select->from('visits_tb', array('target', 'visit_id'))
->joinInner('report_tb', 'visits_tb.visit_id= report_tb.visit_id', array('visit_id', 'rep_id'))
->where("visits_tb.visit_id=$id");
答案 0 :(得分:7)
您可以尝试以下方法;如果你使用表别名可能会更清楚一点:
$db = Zend_Db_Table::getDefaultAdapter();
$select = $db->select()
->from(array('v' => 'visits_tb'), array('target', 'visit_id', 'rep_id'))
->joinInner(array('r' => 'report_tb'), 'v.visit_id = r.visit_id')
->where('v.visit_id = ?', $id);
$query = $select->query();
答案 1 :(得分:1)
$db = Zend_Db_Table::getDefaultAdapter();
$select = $db->select();
$select = $select->from('visits_tb', array('target', 'visit_id'))
->joinUsing('report_tb', 'visit_id', 'rep_id')
->where("visits_tb.visit_id=?",$id);
ZF默认使用内连接,因此joinInner == join。由于FK = PK的名称,因此您可以使用joinUsing。
$rows = $db->fetchAll($select);
答案 2 :(得分:0)
我认为更好的解决方案是在这种情况下使用Zend的关系
http://framework.zend.com/manual/en/zend.db.table.relationships.html
class Visit extends Zend_Db_Table_Abstract
{
protected $_name = 'visit';
protected $_primary = 'visit_id';
}
class Report extends Zend_Db_Table_Abstract
{
protected $_name = 'report';
protected $_primary = 'rep_id';
protected $_referenceMap = array(
'Visit' => array(
'columns' => 'visit_id',
'refTableClass' => 'Visit',
'refColumns' => 'visit_id'
))
}
使用此配置您应该能够使用报告
获取相关的行集$visitTable = new Visit();
//fetch visit with id 13
$visitRow = $visitTable->find(13)->current();
$reportRowset = $visitRow->findDependentRowset('Report');
什么是有益的你可以立即继续处理结果
//for example
foreach ($reportRowset as $report) {
$report->someField = 'newValue';
$report->save();
}
答案 3 :(得分:0)
如果你反过来会怎么样?
$rows = $select->from(array('r'=>'report_tb'), array('rep_id', 'visit_id'))
->join(array('v'=>'visits_tb'), 'r.visit_id= v.visit_id', array('target'))
->where("r.visit_id=$id");
没有测试过代码,但是如果你想输出报告表中指定目标的所有行,我的眼睛看起来更正确。