那是我的查询:
$subquery = "(SELECT `id`, `mark`, `date`, `session` FROM `student_marks` WHERE `student_id` = '" . $studentId . "')";
$q = $this->select()
->distinct()
->setIntegrityCheck(false)
->from($this->_name, array('name AS subjectName', 'student_marks' => new Zend_Db_Expr($subquery)))
->joinLeft('class_teachers', 'class_teachers.subject_id = subjects.id', '')
->joinLeft('teachers', 'teachers.id = class_teachers.teacher_id', array('teachers.name AS teacherName', 'teachers.family AS teacherFamily'))
->joinLeft('student_session_marks', 'student_session_marks.subject_id = subjects.id', array('student_session_marks.id AS sessionMarkId', 'student_session_marks.mark AS sessionMarkName', 'student_session_marks.session AS sessionMarkSession'))
->where('student_session_marks.student_id = ?', $studentId);
查询打印:
SELECT DISTINCT `subjects`.`name` AS `subjectName`,
(SELECT `id`, `mark`, `date`, `session` FROM `student_marks` WHERE `student_id` = '6') AS `student_marks`,
`teachers`.`name` AS `teacherName`, `teachers`.`family` AS `teacherFamily`, `student_session_marks`.`id` AS `sessionMarkId`,
`student_session_marks`.`mark` AS `sessionMarkName`, `student_session_marks`.`session` AS `sessionMarkSession`
FROM `subjects`
LEFT JOIN `class_teachers` ON class_teachers.subject_id = subjects.id
LEFT JOIN `teachers` ON teachers.id = class_teachers.teacher_id
LEFT JOIN `student_session_marks` ON student_session_marks.subject_id = subjects.id
WHERE (student_session_marks.student_id = '6')
当我删除子查询时,我的查询成功工作,否则出现此错误:
SQLSTATE[21000]: Cardinality violation: 1241 Operand should contain 1 column(s).
最佳答案
这是运算符错误...当您进行内部查询以进行选择时,它必须仅返回包含1条记录的1列,而不返回多行/多列的数据集。
与任何任务一样,解决任务的方法很少,要获得最佳解决方案,需要清楚地了解您要执行的操作...
根据您的代码,我认为以下是您要寻找的内容:
public function getStudentSubjectMarks($studentId)
{
// cast your input (assume it's numeric...
$studentId = (int) $studentId;
//
$db = $this->getAdapter();
$q = $db->select()
->distinct()
->from($this->_name, array('name AS subjectName'))
->joinLeft('class_teachers', 'class_teachers.subject_id = subjects.id')
->joinLeft('teachers', 'teachers.id = class_teachers.teacher_id', array(
'teachers.name AS teacherName',
'teachers.family AS teacherFamily',
))
->joinLeft('student_session_marks', 'student_session_marks.subject_id = subjects.id', array(
'student_session_marks.id AS sessionMarkId',
'student_session_marks.mark AS sessionMarkName',
'student_session_marks.session AS sessionMarkSession'
))
->where('student_session_marks.student_id = ?', $studentId);
$data = array();
foreach ($db->fetchAll($q) as $record) {
$queryMarks = $db->select()
->from('student_marks', array('id', 'mark', 'date', 'session'))
->where('student_id = ?', $studentId);
// add marks to the student record
$record['student_marks'] = $db->fetchAll($queryMarks);
// add to main return array
$data[] = $record;
}
// more logic...
return $data;
}
关于php - Zend Framework子查询选择。违反基数:操作数应包含1列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23431611/