MySQL加入从一系列条件中只选择了1个条件
我有一个客户表和一个存储客户地址的单独表。它们通常在地址表中至少有两个连接记录,如果不是更多。当我想要一个邮件列表时,我需要客户的帐单地址,在地址表中用'type'列标记。不幸的是,并非每个客户都有一个标有'结算'的地址。我怎么能写一个陈述来选择标记账单的地址,除非没有一个,在这种情况下选择另一个。我不想只用'或',因为我只想要选择一个记录。MySQL加入从一系列条件中只选择了1个条件
为了简便起见,表看起来是这样的:
客户:
ID地址:
ID
客户ID
型(发货,开票, '',等)
下面是一些SQL是不是我想要的(笑): 从客户选择*内部联接地址上address.custid = Customer.id其中Address.type =“结算”
!!后加! !
Kevin提供了我非常喜欢的coalesce解决方案,但它仅适用于地址表中的单个列。我需要从表格中的所有字段/列形成一个可用的地址。
我一直在试图做到这一点,像这样(只使用两个字段这里简单):select coalesce(concat_ws(',',a1.address, a1.city), concat_ws(',',a2.address, a2.city), concat_ws(',',a3.address, a3.city)) from customer c ...
然而,CONCAT_WS打破总是返回非空的聚结。
我也尝试只是在做每场独立凝聚:coalesce(a1.address, a2.address), coalesce(a1.address2, a2.address2), etc
但这的地址来自3条不同的记录,例如,如果地址2(用于房间号或其他)“混淆”效果空了一排,然后它会在那里插入一条不同的记录地址2。
有谁知道如何防止concat_ws返回非null,即使字段为空内?
回答:
如果存在的话这将让你的账单地址,否则送货地址:
select ifnull(a1.address, a2.address) from customer c left join address a1 on c.id = a1.custid and a1.type = 'billing'
left join address a2 on c.id = a2.custid and a2.type = 'shipping'
,如果你想检查是否有其他类型,可以添加连接和使用,而不是IFNULL聚结,像这样:
select coalesce(a1.address, a2.address, a3.address) from customer c left join address a1 on c.id = a1.custid and a1.type = 'billing'
left join address a2 on c.id = a2.custid and a2.type = 'shipping'
left join address a3 on c.id = a3.custid and a3.type = 'X'
回答:
select c.id, a.id from customer c join address a on a.custid = c.id
where a.type = 'Billing'
union
select c.id, a.id
from customer c join address a on a.custid = c.id
where a.type <> 'Billing'
and c.id not in (select custid from address a where a.type = 'Billing')
这是一种方法。
回答:
没有OR子句就很难做到这一点。假设你正在寻找的地址ID:
SELECT Address.id
FROM Address LEFT JOIN Customer ON Customer.id = Address.custid
WHERE Address.id EXIST (
SELECT
Address.id
FROM Address LEFT JOIN Customer ON Customer.id = Address.custid
WHERE Address.type LIKE 'shipping'
) OR Address.type = 'billing'
回答:
select ... from customer c join address a on a.custid = c.id
where a.type = 'Shipping'
union all
select ...
from customer c join address a on a.custid = c.id
where a.type = 'Billing' and not exists (
select 1 from address a2
where a2.custid = a.custid and a2.type = 'Shipping'
)
如果你需要一点点更通用的牛逼母鸡,你可能会发现这个“黑客”有用:
select * from address where id in (
select
min(case type
when 'Shipping' then 100000000
when 'Billing' then 200000000
when ... then 300000000
else 900000000
end + a.id) % 100000000 /* not sure of MySQL for modulo operation */
from address a
group by custid
)
以上是 MySQL加入从一系列条件中只选择了1个条件 的全部内容, 来源链接: utcz.com/qa/262181.html