mysql if条件

时间:2019-07-12 14:24:04

标签: mysql sql if-statement conditional-statements

基本上我有一张桌子,所有客户都有一个带有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不同: enter image description here

我需要一个或另一个都不是,所以层次结构是:如果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')

3 个答案:

答案 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
)