我想在我的数据库中获取下一个和上一个记录,这是我第一次使用DQL而且我真的不明白它为什么不起作用。
这是我的自定义查询的样子:
$em = $this->getDoctrine()->getManager();
$rsm = new ResultSetMapping();
$rsm->addScalarResult('id', 'id');
$query = $em->createNativeQuery(
'SELECT id
FROM SITEArticlesBundle:Article
WHERE
id = (SELECT id
FROM SITEArticlesBundle:Article
WHERE ? > 2 LIMIT 1)
OR
id = (SELECT id
FROM SITEArticlesBundle:Article
WHERE ? < 2 LIMIT 1)', $rsm);
$query->setParameter(1, $id);
$query->setParameter(2, $id);
$nextAndPrevNews = $query->execute();
我想得到2个id的数组,就像那样:
[
['id' => 1]
['id' => 3]
]
但是我收到了SQL语法错误
SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法中有错误;查看与您的MySQL服务器版本对应的手册,以获得在&#39;:文章附近使用的正确语法 哪里 id =(SELECT id 来自&#39;在第2行
如果有人能帮助我,我将非常感激。
由于
答案 0 :(得分:1)
一个问题是表名中的冒号字符。除非转义表名,否则不允许使用该字符。
我怀疑SITEArticlesBundle:Article
不是MySQL表的实际标识符。在本机查询中,您需要指定MySQL表的实际名称。
如果这是你的表名,那么你可以用反引号字符将其括起来:
FROM `SITEArticlesBundle:Article`
我不确定为什么要将$ id的值与文字2进行比较,而不是将其与表格中id
列的值进行比较。我不明白。
除非您尝试将列名称作为绑定参数传递,否则将无效。您只能将值传递给准备好的SQL语句,不能将标识符或关键字或其他SQL结构作为绑定参数传递。
就个人而言,我会避免OR条件和子查询,只使用UNION ALL操作。
SELECT MAX(p.id) AS id
FROM `SITEArticlesBundle:Article` p
WHERE p.id < ?
UNION ALL
SELECT MIN(n.id) AS id
FROM `SITEArticlesBundle:Article` n
WHERE n.id > ?