如何选择1:n相关记录,MySQL中每种类型至少2个

时间:2017-03-23 10:39:36

标签: mysql select count group-by relational

我有以下数据库表。

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

如何选择其正确记录AT LEAST 2 statusnew2 statusold的左侧记录。例如,left_id 1不是目标,因为它的三个正确记录的状态为new,但只有一个记录的状态为旧。

到目前为止,我有。

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

2 个答案:

答案 0 :(得分:2)

在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

答案 1 :(得分:1)

首先对值进行分组然后检查其总数,即可获得所需的结果。如果它的> = 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