2011-04-18 60 views
1

例如,我正在对同一个表进行内部连接。 我想从表1或表2中选择那些值不为null的字段。Mysql查询:INNER JOIN和SELECT *表示任何表不为空

这里查询为例:

SELECT a2.*,a.town 
FROM `ads` AS `a` 
LEFT JOIN discounts d ON d.ad_id=a.id 
INNER JOIN ads a2 ON a2.id=d.discount_ad_id 
LEFT JOIN `departments` AS `dp` ON dp.department_id = a.department 
LEFT JOIN `map_towns` AS `mt` ON mt.town_id = a.town 
WHERE (a.department = 9 OR a.department = 15) 
GROUP BY `d`.`discount_id` 

A2有镇域为好,但我可以有null值。如果它不是空的,我需要选择a2.town。 这与所有其他领域有关。 :)

可能吗?

感谢;)

回答

0
SELECT a2.*, COALESCE(a2.town, a.town) 
FROM `ads` AS `a` 
JOIN discounts d 
ON  d.ad_id = a.id 
JOIN ads a2 
ON  a2.id = d.discount_ad_id 
LEFT JOIN 
     `departments` AS `dp` 
ON  dp.department_id = a.department 
LEFT JOIN 
     `map_towns` AS `mt` 
ON  mt.town_id = a.town 
WHERE a.department IN (9, 15) 
GROUP BY 
     `d`.`discount_id` 

注意LEFT JOINdiscounts是在查询冗余:在NULL记录将永远不会返回,因为他们绝不会通过以下INNER JOIN匹配到ads a2

+0

是否有可能以动态的方式做到这一点?无需手动对每个字段进行操作? – Somebody 2011-04-18 10:42:37

+0

@Beck:我不明白这个问题。什么意思是“手动做”? – Quassnoi 2011-04-18 10:49:54

+0

COALESCE(a2。*,a。*)我的意思是这种方式有可能吗? :) – Somebody 2011-04-18 10:54:17

1

使用ANSI函数COALESCE,或MySQL的函数IFNULL。根据需要别名列

SELECT 
    a2.id, 
    a2.col2, 
    coalesce(a2.town, a.town) town, 
    IFNULL(a2.city, a.city) city, 
...etc