如果GROUP_CONCAT返回NULL

时间:2019-06-03 10:05:59

标签: mysql

如果这是欺骗,我深表歉意。我找不到。

我有一个复杂的查询,它命中3个表,如果GROUP_CONCATshows返回NULL(经常这样做),我需要弄清楚如何排除整个结果。要澄清的是,如果shows出现NULL,那么我也不需要该结果的任何profile数据。我希望跳过整行。

SELECT
  `profiles`.*,
  IF( `profiles`.`profile_id` IN(
    SELECT DISTINCT (`badges`.`profile_id`)
    FROM `badges`
  ), TRUE, FALSE ) AS `has_registrations`,
  (SELECT
    GROUP_CONCAT( DISTINCT `shows`.`show_name` SEPARATOR '<br>' )
    FROM `shows`
    LEFT JOIN `badges` ON `badges`.`show_id` = `shows`.`show_id`
    WHERE
      `badges`.`profile_id` = `profiles`.`profile_id` 
      AND `shows`.`end_date` >= CURDATE()
  ) AS `shows`
FROM `profiles`

还接受有关整体查询的速度/优雅程度的输入。

3 个答案:

答案 0 :(得分:0)

也许有一种更有效的方法可以做到这一点,但我认为简单的where子句就能解决问题。

SELECT
  `profiles`.*,
  IF( `profiles`.`profile_id` IN(
    SELECT DISTINCT (`badges`.`profile_id`)
    FROM `badges`
  ), TRUE, FALSE ) AS `has_registrations`,
  (SELECT
    GROUP_CONCAT( DISTINCT `shows`.`show_name` SEPARATOR '<br>' )
    FROM `shows`
    LEFT JOIN `badges` ON `badges`.`show_id` = `shows`.`show_id`
    WHERE
      `badges`.`profile_id` = `profiles`.`profile_id` 
      AND `shows`.`end_date` >= CURDATE()
  ) AS `shows`
FROM `profiles`
where `shows` IS NOT NULL

答案 1 :(得分:0)

您可以添加一个having子句:

SELECT
  `profiles`.*,
  IF( `profiles`.`profile_id` IN(
    SELECT DISTINCT (`badges`.`profile_id`)
    FROM `badges`
  ), TRUE, FALSE ) AS `has_registrations`,
  (SELECT
    GROUP_CONCAT( DISTINCT `shows`.`show_name` SEPARATOR '<br>' )
    FROM `shows`
    LEFT JOIN `badges` ON `badges`.`show_id` = `shows`.`show_id`
    WHERE
      `badges`.`profile_id` = `profiles`.`profile_id` 
      AND `shows`.`end_date` >= CURDATE()
  ) AS `shows`
FROM `profiles`
having shows is not null

答案 2 :(得分:0)

如果我正确理解问题,则不需要空值。可能由于使用左联接而出现空值,为什么不尝试使用内部联接,它们将不会为空值。