gpt4 book ai didi

mysql - 在我的 Web 应用程序中获取主键列显示为 null 的结果,但在 SQL Workbench 中相同的 SELECT 语句工作正常

转载 作者:行者123 更新时间:2023-11-29 15:25:27 24 4
gpt4 key购买 nike

当我在 mySQL Workbench 中执行以下 mySQLi 查询语句时,它适用于具有非空 id 值的所有行 - 这是因为 users.id 是主键列,可能不包含空值,即使艺术家中没有相关行,与艺术家的外连接也会返回来自用户的行,但反之则不然。

SELECT `users`.`id`,
`users`.`username`,
`users`.`id` AS 'users_id',
`artists`.`id` AS 'artists_id',
`artists`.*
FROM `users` LEFT OUTER JOIN `artists` ON `artists`.`users_id` = `users`.`id`
WHERE IFNULL( `users`.`active`, -1 ) != 3
ORDER BY `users`.`username`, `users`.`id`

但是,当我在 Sympfony v2.8 和 Doctrine DBAL 中运行相同的查询时,使用以下语句,当我查看 $indexData 的内容时,返回行数组末尾的几个元素具有 null id 值XDebugger 中的数组:

$indexData = $conn->fetchAll( $sqlStmnt );

请注意,不会返回任何错误,并且两个查询都返回 51 行。

最佳答案

我将 SELECT 查询重写为两部分,以便删除 LEFT OUTER JOIN,然后对这两个部分进行 UNION 并应用与原始查询中使用的相同排序,但我必须使用相对列顺序,因为UNION 不允许按源表列排序。请注意,第一部分使用不在 Artists 表的子查询中的 user.id 来消除第二部分中找到的行。

(
SELECT `users`.`id`,
`users`.`username`,
`users`.`id` AS 'users_id',
`users`.*, NULL AS 'artists_id',
NULL AS 'name',
NULL AS 'artists_name_1st_char',
NULL AS 'genre',
NULL AS 'slug',
NULL AS 'slug_count',
NULL AS 'member_names',
NULL AS 'background',
NULL AS 'influences',
NULL AS 'bio',
NULL AS 'website',
NULL AS 'instruments',
NULL AS 'seeking',
NULL AS 'youtube',
NULL AS 'facebook',
NULL AS 'instagram',
NULL AS 'snapchat',
NULL AS 'twitter'
FROM `users`
WHERE IFNULL( `users`.`active`, -1 ) != 3
AND `users`.`id` not in ( SELECT `artists`.`users_id` FROM `artists`)
)
UNION ALL
(
SELECT `users`.`id`,
`users`.`username`,
`users`.`id` AS 'users_id',
`users`.*,
`artists`.`id` AS 'artists_id',
`artists`.`name` AS 'name',
`artists`.`artists_name_1st_char` AS 'artists_name_1st_char',
`artists`.`genre` AS 'genre',
`artists`.`slug` AS 'slug',
`artists`.`slug_count` AS 'slug_count',
`artists`.`member_names` AS 'member_names',
`artists`.`background` AS 'background',
`artists`.`influences` AS 'influences',
`artists`.`bio` AS 'bio',
`artists`.`website` AS 'website',
`artists`.`instruments` AS 'instruments',
`artists`.`seeking` AS 'seeking',
`artists`.`youtube` AS 'youtube',
`artists`.`facebook` AS 'facebook',
`artists`.`instagram` AS 'instagram',
`artists`.`snapchat` AS 'snapchat',
`artists`.`twitter` AS 'twitter'
FROM `users` INNER JOIN `artists` ON `artists`.`users_id` = `users`.`id`
WHERE IFNULL( `users`.`active`, -1 ) != 3
)
ORDER BY 2, 1

此查询实际上可能比原始查询更有效,因为它不使用 LEFT OUTER JOIN。但是,它不能使用 arts.* 来允许查询获取该表中的所有列。相反,艺术家中的列必须在 SELECT 子句中显式命名,因此必须在此查询中考虑艺术家表中的列更改。对我来说这只是一个小小的不便。

关于mysql - 在我的 Web 应用程序中获取主键列显示为 null 的结果,但在 SQL Workbench 中相同的 SELECT 语句工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59116897/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com