【问题标题】:Same join query: two different results through Phalcon and phpMyAdmin相同的连接查询:通过 Phalcon 和 phpMyAdmin 的两个不同结果
【发布时间】:2026-02-21 17:15:02
【问题描述】:

我正在使用 php Phalcon 框架。

使用 phalcon 执行的查询:

$rawQuery = 
    'SELECT users.ID, users.Name, users.ProfilePictureUrl, users.Birthday, GetAge(users.Birthday) as Age, ' .
    '    users.Sex, users.LookingFor, commons.Name as CommonName, provinces.Name as ProvinceName, users.LastOnline FROM favorites ' .
    'INNER JOIN users ON favorites.FavoriteUserID = users.ID ' .
    'INNER JOIN commons ON commons.ID = users.CommonID ' .
    'INNER JOIN provinces ON provinces.ID = commons.ProvinceID ' .
    'WHERE favorites.OriginUserID = ' . $this->ID;
return $this->getReadConnection()->query($rawQuery)->fetchAll();

此查询正确返回所有字段,除了 CommonName,它应该是字符串“Aglié”,但为空。示例输出:

[{"ID":"2","0":"2","Name":"Olga","1":"Olga","ProfilePictureUrl":"asd","2":"asd","Birthday":"2014-07-09","3":"2014-07-09","Sex":"f","4":"f","LookingFor":"girls","5":"girls","CommonName":null,"6":null,"ProvinceName":"Torino","7":"Torino","LastOnline":null,"8":null}]

另一方面,通过 phpMyAdmin 执行相同的查询:

SELECT users.ID, users.Name, users.ProfilePictureUrl, users.Birthday, GetAge(users.Birthday) as Age,
    users.Sex, users.LookingFor, commons.Name as CommonName, provinces.Name as ProvinceName, users.LastOnline FROM favorites
INNER JOIN users ON favorites.FavoriteUserID = users.ID 
INNER JOIN commons ON commons.ID = users.CommonID
INNER JOIN provinces ON provinces.ID = commons.ProvinceID
WHERE favorites.OriginUserID = 1

它无限期地挂起。但是,如果我取出 Age 字段,它会返回所有正确的字段,包括 CommonName(有效字符串)。示例输出:

ID, Name, ProfilePictureUrl, Birthday, Sex, LookingFor, CommonName, ProvinceName, LastOnline
2, Olga, asd, 2014-07-09, f, girls, Agliè, Torino, NULL

GetAge(birthday) 定义如下:

return DATE_FORMAT(FROM_DAYS(DATEDIFF(curdate(),birthday)), '%Y')

为简单起见,您可以假设只有 4 个表用户、收藏夹、公地和省份,查询中只使用了这些字段。其他的都没有用。

这对我来说完全没有意义......请帮忙!

Apache 2.4.4 版

PHP 版本 5.4.12

MySql 版本 5.6.12

Phalcon 1.3.2 版

Windows 7 64 位操作系统

【问题讨论】:

  • 如果用定义替换函数调用会发生什么?我可以为 GetAge 推荐TIMESTAMPDIFF。这很简单:TIMESTAMPDIFF(YEAR, birthday, CURDATE()) 如果生日是 DATE 或 DATETIME 类型。结果是一个整数。
  • 嗯,这是一个小问题。现在,我的问题是 CommonName 列为空:我无法解释...
  • 这对每个人都有效吗?
  • 我还在开发中,我只有几条记录,但是是的,两者都有效。
  • commons 表上尝试一个简单的查询。 SELECT Name FROM commons as CommonName;

标签: php mysql join phpmyadmin phalcon


【解决方案1】:

这是因为通用名称末尾的特殊字符“é”。显然,如果 json_encode 包含此类字符,它将跳过该字段。我通过直接在公共表中转义特殊字符来解决。

【讨论】:

  • 很高兴你把它整理出来。您可以将自己的答案标记为已接受,这样它就不会再出现在未回答的问题列表中。
  • 啊,当然——我忘了​​延迟。感谢您的评论!