参数号无效,联合选择

I really can't spot my mistake in here.

$query = <<<'BUM'
(
    SELECT ca.id, ca.name, ca.slug, ca.record_date, 2 AS complete, 0 AS numbers
    FROM  `cms_articles_article` ca
    WHERE record_date
    BETWEEN ':y_1 - :m_1 -01'
    AND ':y_2 - :m_2 -31'
    GROUP BY ca.id
    LIMIT 0, 3)
UNION ALL (
    SELECT ca.id, ca.name, ca.slug, ca.record_date, 1 AS complete, COUNT( ca.id ) AS numbers
    FROM  `cms_articles_article` ca
    WHERE YEAR( record_date ) = :y_3
    GROUP BY MONTH( record_date )
    )
UNION ALL (
    SELECT ca.id, ca.name, ca.slug, ca.record_date, 0 AS complete, COUNT( ca.id ) AS numbers
    FROM  `cms_articles_article` ca
    GROUP BY YEAR( record_date )
    )
ORDER BY 
complete ASC, 
record_date DESC
BUM;

$stmt = $db
->prepare($query)
;
$year = 2013;
$month = 12;
$stmt->execute(array(
    ':y_1' => $year, 
    ':y_2' => $year, 
    ':y_3' => $year, 
    ':m_1' => $month,
    ':m_2' => $month,
    ));

I took into account the fact you can't reuse named parameter. If you remove the :y_3 from query (and execution), it will run correctly. Any help is appreciated.

You cannot use params inside strings.

':y_2 - :m_2 -31' -- is just a string, 0 parameters

Your whole query has only 1 parameter.

, :y_2 - :m_2 -31 -- is expression, 2 parameters

Try putting an ALIAS on your subqueries like:

UNION ALL (
 SELECT ca.id, ca.name, ca.slug, ca.record_date, 1 AS complete, COUNT( ca.id ) AS numbers
 FROM  `cms_articles_article` ca
 WHERE YEAR( record_date ) = :y_3
 GROUP BY MONTH( record_date )
) A
UNION ALL (
 SELECT ca.id, ca.name, ca.slug, ca.record_date, 0 AS complete, COUNT( ca.id ) AS numbers
 FROM  `cms_articles_article` ca
 GROUP BY YEAR( record_date )
) B