如果这是欺骗,我深表歉意。我找不到。
我有一个复杂的查询,它命中3个表,如果GROUP_CONCAT
和shows
返回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`
还接受有关整体查询的速度/优雅程度的输入。
答案 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)
如果我正确理解问题,则不需要空值。可能由于使用左联接而出现空值,为什么不尝试使用内部联接,它们将不会为空值。