如何 select 1:n 相关记录,在 MySQL 中每种类型最少 2 个

How to select 1:n related records which are minimum 2 per type in MySQL

我有以下数据库表。

my_left_table 
left_id      name 
1            A
2            B
3            C

my_right_tabe
right_id    thing     left_id_fk    status
1           D          1            new
2           E          1            new
3           F          2            old 
4           G          3            old
5           H          3            new
6           I          3            new
7           J          1            old
8           K          2            old
9           L          2            new
10          M          3            old
11          N          3            old
12          O          1            new

我想要的结果如下。

my_left_table 
left_id     name 
3            C

如何 select 其右侧记录 AT LEAST 2 statusnew2 statusold 的左侧记录。例如,left_id 1 不是目标,因为其右侧的三个记录的状态为新,但只有一个记录的状态为旧。

到目前为止我有。

SELECT *, COUNT(my_right_tabe.left_id_fk) AS count_left_id_fk  
FROM my_left_table 
INNER JOIN my_right_tabe 
ON my_left_table.id = my_right_tabe.left_id_fk 
GROUP BY my_right_tabe.left_id_fk

在MySQL中使用HAVING子句 喜欢下面

SELECT my_left_table.left_id, my_left_table.name
FROM my_left_table 
INNER JOIN my_right_tabe 
ON my_left_table.left_id = my_right_tabe.left_id_fk 
GROUP BY my_right_tabe.left_id_fk
HAVING SUM(my_right_tabe.status="new") >= 2 AND
       SUM(my_right_tabe.status="old") >= 2

您可以通过先对值进行分组然后检查其总数来获得所需的结果。如果它 >= 2 拉那个记录。

这里是查询

SELECT z.*
FROM
(
    SELECT a.left_id, name, status, IF(COUNT(*) >=2, 1, 0) AS status_calc
    FROM my_left_table a JOIN my_right_table b
    ON a.left_id = b.left_id_fk
    GROUP BY left_id, status
) z
GROUP BY z.left_id
HAVING SUM(status_calc) = 2;

Working Demo