带有mysql的教义序数错误:预期文字,得到'@'

问题描述

我需要一个来自 MysqL 数据库的序号。我发现如何像这样在 MysqL 中模拟 row_num:

    SET @row=0;
    SELECT * FROM (
     SELECT (@row:=@row+1) AS no,id,name FROM `attribute` ORDER BY id
     ) t WHERE name LIKE "%Jo%"

我以以下代码开头:

$this->getEntityManager()->getConnection()->exec("SET @counter = 0");

我尝试过:

        $this->result = $this->createqueryBuilder('a')
            ->select('a')
            ->where($expr->in('att.ordinal_number',$this->createqueryBuilder('att')->
                    select('(@counter:=@counter+1) AS ordinal_number')->
                    from(\App\Entity\Attribute::class,'att')->
                    orderBy('att.id')->getDQL()))

我尝试过:

        $this->result = $this->createqueryBuilder('a')
            ->select('a')
            ->addSelect('(SELECT (@counter:=@counter+1) AS oridinal_number,'
                    .' name FROM App:Entity:Atrribute ORDER BY id)')

以上给我:

错误:预期文字,得到“@”

有人知道如何用MysqL模拟教义中的row_number吗? 提前致谢。

解决方法

AFAIK 没有直接的方法将这些数据库变量合并到 DQL 或查询构建器中,您需要执行 Native SQL,然后使用 ResultSetMapping 类将查询结果映射到您的实体>

SQL

SELECT * 
FROM (
    SELECT (@row:=@row+1) AS no,id,name
    FROM `attribute`,(SELECT @row:=0) t
    ORDER BY id
) t WHERE name LIKE "%Jo%"

结果集映射

$rsm = new ResultSetMapping;
$rsm->addEntityResult('Attribute','a');
$rsm->addFieldResult('a','id','id');
$rsm->addFieldResult('a','name','name');
$rsm->addScalarResult('no','no');

$query = $this->_em->createNativeQuery('SELECT * 
                                        FROM (
                                            SELECT (@row:=@row+1) AS no,name
                                            FROM attribute,(SELECT @row:=0) t
                                            ORDER BY id
                                        ) t WHERE name LIKE ?',$rsm);
$query->setParameter(1,'%Jo%');
$users = $query->getResult();