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

问题描述 投票:0回答:1

当我在mySQL Workbench中执行以下mySQLi查询语句时,它对具有非null id值的所有行都可以正常工作-这是因为users.id是主键列,可能不包含null,并且与艺术家的外部联接会从用户返回行,即使艺术家中没有相关行,反之亦然。

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数组的内容时,返回行的数组末尾的几个元素具有空id值在XDebugger中:

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

注意,没有错误返回,并且两个查询都返回51行。

mysql null doctrine symfony-2.8 dbal
1个回答
0
投票

我将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。但是,它不能使用Artists。*来允许查询获取该表中的所有列。而是必须在SELECT子句中显式指定Artist中的列,因此必须在此查询中考虑Artist表中的列更改。对我来说,这只是一个小麻烦。

© www.soinside.com 2019 - 2024. All rights reserved.