MySQL 5.6:ANY_VALUE 函数的替代方案
使用 MySQL 版本 5.7 和 5.6 时,可能会遇到有关 ANY_VALUE 函数的问题,这仅在 5.7 版本中可用。这可能会导致查询执行期间出现混乱和错误。问题出现了:如何在 MySQL 5.6 中获得类似的功能?
MySQL 5.6 没有提供与 ANY_VALUE 直接等效的功能。但是,还有其他方法可以实现所需的结果。
禁用 ONLY_FULL_GROUP_BY 模式
一种选择是禁用 ONLY_FULL_GROUP_BY SQL 模式。此模式强制 SELECT 语句中引用的所有非聚合列也必须出现在 GROUP BY 子句中。通过禁用此模式,MySQL 将允许执行这样的查询而不会出现错误:
SELECT c.id, c.name, ANY_VALUE(i.url) url, ANY_VALUE(i.lat) lat, ANY_VALUE(i.lng) lng FROM countries c, images i WHERE i.country_id = c.id GROUP BY c.id;
要禁用 ONLY_FULL_GROUP_BY,请使用以下语法:
SET @mode := @@SESSION.sql_mode; SET SESSION sql_mode = ''; /* your query here */ SET SESSION sql_mode = @mode;
但是,重要的是请注意,禁用 ONLY_FULL_GROUP_BY 可能会导致某些情况下出现错误结果或意外行为
选择“第一个”值
另一种方法是修改查询以从图像表中选择特定值,例如第一个值。这可以使用 MIN() 函数和子查询来实现:
SELECT c.id, c.name, i.* FROM countries c LEFT JOIN ( SELECT MIN(id) id, country_id FROM images GROUP BY country_id ) first ON c.id = first.country_id LEFT JOIN images i ON first.id = i.id
此查询将为每个国家/地区返回一行,图像是表中的第一个图像,按其 ID 排序。这种方法提供了可预测且一致的结果。
以上是如何模仿 MySQL 5.6 版本中的 ANY_VALUE 函数?的详细内容。更多信息请关注PHP中文网其他相关文章!