基本上我有一张桌子,所有客户都有一个带有customer_group_id=0
的默认行
但是此客户中的某些人将属于customer_group_id=1
当发生这种情况时,将使用customer_group_id=1
为客户创建新行,因此现在我有2行针对同一客户,但不同的customer_group_id。
现在,当我获取数据时,我首先需要从customer表中选择*,其中customer_group_id = 1,但如果不存在,请给我,然后使用customer_group_id = 0(这是默认值),并继续直到返回所有数据。
有人知道实现这一目标的最佳方法吗?
更新:屏幕截图显示了2个行,这些行具有相同的customer_id,customer_group_id
不同:
我需要一个或另一个都不是,所以层次结构是:如果customer_group_id = 1存在,则返回该行并忽略其他,否则返回默认值customer_group_id = 0
我的完整查询:
SELECT `main_table`.*, `secondTable`.* FROM `customer` AS `main_table`
LEFT JOIN `customer_group` AS `secondTable` ON main_table.customer_id = secondTable.customer_id
WHERE (secondTable.customer_group_id = '1' )
AND (`secondTable`.`is_active` = '1')
答案 0 :(得分:1)
如果只有两个组,那么聚合很简单:
select customer_id, max(customer_group_id)
from t
group by customer_id;
在MySQL 8+中,您可以使用row_number()
来实现更高的客户优先级:
select t.*
from (select t.*,
row_number() over (partition by customer_id order by customer_group_id desc) as seqnum
from t
) t
where seqnum = 1;
答案 1 :(得分:0)
您可以做的是使用customer_group_id=1
为客户获取所有行,然后使用UNION ALL
通过使用customer_group_id=1
来获取不包含select * from tablename
where customer_group_id=1
union all
select * from tablename t
where t.customer_group_id=0
and not exists (
select 1 from tablename
where customer_id = t.customer_id and customer_group_id=1
)
任何行的客户行不存在:
{{1}}
答案 2 :(得分:0)
对于带有customer_group_id = 0
的行,请验证对于同一customer_group_id = 1
没有带有customer_id
的行。您可以使用NOT EXISTS子查询:
SELECT c.*, g.*
FROM customer AS c
JOIN customer_group AS g ON c.customer_id = g.customer_id
WHERE NOT EXISTS (
SELECT *
FROM customer_group AS g2
WHERE g2.customer_id = c.customer_id
AND g2.customer_group_id = 1
AND g.customer_group_id = 0
)