Mysql 未找到列:1054未知列';PlantingBlock.id';在';字段列表';

Mysql 未找到列:1054未知列';PlantingBlock.id';在';字段列表';,mysql,cakephp,stored-procedures,Mysql,Cakephp,Stored Procedures,我需要使用cakephp和mysql将字符串传递给存储过程 这是我要传递给存储过程的字符串 PlantingBlock.id IN (13,10) SET whereClause = " AND 1 = 1 "; IF(in_clause IS NULL OR in_clause = '') THEN SET whereClause = CONCAT(whereClause, ' AND ',in_clause); END IF; SET statement = 'SELECT Pl

我需要使用cakephp和mysql将字符串传递给存储过程

这是我要传递给存储过程的字符串

PlantingBlock.id IN (13,10)
SET whereClause = " AND 1 = 1 ";
IF(in_clause IS NULL OR in_clause = '') THEN
    SET whereClause = CONCAT(whereClause, ' AND ',in_clause);
END IF;

SET statement = 'SELECT PlantingBlock.* FROM (
    SELECT PB.*, 
    B.block,
    V.variety,
    ST.size_type,
    PLA.date AS plant_date,
    PLA.week_no,
    C.crop,
    C.id AS crop_id
    FROM lf_planting_blocks AS PB,
         lf_blocks AS B,
         lf_properties AS P,
         lf_property_types AS PT,  
         lf_size_types AS ST,
         lf_varieties AS V,
         lf_plantings AS PLA,
         lf_crops AS C
    WHERE
        PB.block_id = B.id
        AND B.property_id = P.id
        AND P.property_type_id = PT.id
        AND B.size_type_id = ST.id
        AND PB.variety_id = V.id
        AND V.crop_id = C.id
        AND PB.planting_id = PLA.id
        AND PB.plant_still_active = true
        AND B.is_deleted = false
        AND P.is_deleted = false
        AND PT.is_deleted = false
        AND ST.is_deleted = false
        AND V.is_deleted = false
        AND C.is_deleted = false';

SET statement = CONCAT(statement, whereClause, ') AS PlantingBlock ORDER BY PlantingBlock.plant_date DESC');
下面是我的存储过程

PlantingBlock.id IN (13,10)
SET whereClause = " AND 1 = 1 ";
IF(in_clause IS NULL OR in_clause = '') THEN
    SET whereClause = CONCAT(whereClause, ' AND ',in_clause);
END IF;

SET statement = 'SELECT PlantingBlock.* FROM (
    SELECT PB.*, 
    B.block,
    V.variety,
    ST.size_type,
    PLA.date AS plant_date,
    PLA.week_no,
    C.crop,
    C.id AS crop_id
    FROM lf_planting_blocks AS PB,
         lf_blocks AS B,
         lf_properties AS P,
         lf_property_types AS PT,  
         lf_size_types AS ST,
         lf_varieties AS V,
         lf_plantings AS PLA,
         lf_crops AS C
    WHERE
        PB.block_id = B.id
        AND B.property_id = P.id
        AND P.property_type_id = PT.id
        AND B.size_type_id = ST.id
        AND PB.variety_id = V.id
        AND V.crop_id = C.id
        AND PB.planting_id = PLA.id
        AND PB.plant_still_active = true
        AND B.is_deleted = false
        AND P.is_deleted = false
        AND PT.is_deleted = false
        AND ST.is_deleted = false
        AND V.is_deleted = false
        AND C.is_deleted = false';

SET statement = CONCAT(statement, whereClause, ') AS PlantingBlock ORDER BY PlantingBlock.plant_date DESC');
这会产生一个名为,
SQLSTATE[42S22]:未找到列:“字段列表”中的1054未知列“PlantingBlock.id”

问题是,在引用
id
列时,您试图使用提供给此子查询的别名向内部select添加条件

因此,您可以用括号关闭子查询,并将
WHERE
子句应用于外部
SELECT

SELECT PlantingBlock.* 
FROM 
(
   ...
) AS PlantingBlock
 WHERE PlantingBlock.id IN (13,10) 
 ORDER BY PlantingBlock.plant_date DESC
或者更好的方法是只参考内部选择中的id字段

SELECT PlantingBlock.* 
FROM 
(
   ...
   AND PB.id IN (13,10)
) AS PlantingBlock
 ORDER BY PlantingBlock.plant_date DESC

Irawana,如果你觉得答案是有用的,请考虑一下。