내 쿼리에 위치 매개 변수가 없기 때문에이 오류가 발생합니다. 여기 방법 :SQLSTATE [HY093] : 유효하지 않은 매개 변수 번호 : 명명 된 위치 매개 변수와 혼합 된 매개 변수
public function getAll(User $user, DateTime $start = null, DateTime $end = null)
{
$params = array('user_id' => $user->getId());
$rsm = new \Doctrine\ORM\Query\ResultSetMapping(); // Result set mapping
$rsm->addScalarResult('subtype', 'subtype');
$rsm->addScalarResult('count', 'count');
$sms_sql =
"SELECT CONCAT('sms_', IF(is_auto = 0, 'user' , 'auto')) AS subtype, " .
"SUM(messages_count * (customers_count + recipients_count)) AS count " .
"FROM outgoing_message AS m INNER JOIN small_text_message AS s ON " .
"m.id = s.id WHERE status <> 'pending' AND user_id = :user_id";
$news_sql =
"SELECT CONCAT('news_', IF(is_auto = 0, 'user' , 'auto')) AS subtype, " .
"SUM(customers_count + recipients_count) AS count " .
"FROM outgoing_message AS m JOIN newsletter AS n ON m.id = n.id " .
"WHERE status <> 'pending' AND user_id = :user_id";
if($start) :
$sms_sql .= " AND sent_at >= :start";
$news_sql .= " AND sent_at >= :start";
$params['start'] = $start->format('Y-m-d');
endif;
$sms_sql .= ' GROUP BY type, is_auto';
$news_sql .= ' GROUP BY type, is_auto';
return $this->_em->createNativeQuery("$sms_sql UNION ALL $news_sql", $rsm)
>setParameters($params)->getResult();
}
그리고이 예외 예외 :
SQLSTATE [HY093] : 유효 파라미터 번호 : 명명 된 혼합 위치 파라미터
배열 $params
가 OK이고 그래서 generated SQL :
var_dump($params);
array (size=2)
'user_id' => int 1
'start' => string '2012-01-01' (length=10)
이상한 점은 "$sms_sql"
에서만 작동한다는 것입니다.
업데이트
다른 이상한 것을 발견했습니다. 나는 (start_date
대신 start
의에) 이름 만 변경하는 경우 :
if($start) :
$sms_sql .= " AND sent_at >= :start_date";
$news_sql .= " AND sent_at >= :start_date";
$params['start_date'] = $start->format('Y-m-d');
endif;
무엇 발생하는 것을 :
SQLSTATE [42S22] : 발견되지 칼럼 : 1054 알 수없는 열 'sent1rt_date ' 에서'where 절 '문자열
1rt
는 열 이름의 중간에 추가 된로
...!
이 줄은 "SUM (messages_count * (customers_count + recipients_count)) AS count"를 사용하여 mysql 명령 줄을 열고 쿼리 만 테스트 할 수 있습니까? – jcho360
@ jcho360 내가 $ sms_sql 쿼리를 사용하는 경우 작동합니다 줄을 잘 작동합니다! – gremo
SQL에 이상한 점이 있지만 문제가 아닌 것 같습니다. status, user_id, sent_at, is_auto 및 type 열에 대한 참조는 qualifier가 아니며 테이블 별칭이 아닙니다. SELECT 목록의 별칭으로 "count"라는 예약어를 사용하고 있습니다 (실제로 백틱으로 묶어야 함). 조금 이상하지만 '유형'별로 그룹화했지만 해당 열은 쿼리의 다른 곳에 포함되지 않습니다. 그것은 합법적입니다, 조금 이상합니다. 테이블 별칭으로 자격을 얻었습니다. 그러나 그 중 아무 것도 정말로 문제는 아닙니다. – spencer7593