Mysql多选用排除行

时间:2010-09-10 15:11:44

标签: php sql mysql

有两张桌子:

A(`A_id`,`A_name`)

B(`B_id`,`A_id`,`B_kind`)

B_kind列为ENUM('type 1','type 2')。那么,我怎样才能获得表A中包含B但没有B_kind='type 1'的条目的所有行B_kind='type 2'

php中的表示:

$A = array();
$B = array();
$sample = array();
foreach( $A as $key => $value )
{
    if( find_type1($value,$B) && ! find_type2($value,$B) )
    $sample[] = $A;
}

请帮助,我该怎么做?

3 个答案:

答案 0 :(得分:4)

您可以使用existsnot exists

select  *
from    A
where   exists
        (
        select  *
        from    B
        where   B.A_Id = A.A_Id
                and B.B_kind = 'type 1'
        )
        and not exists
        (
        select  *
        from    B
        where   B.A_Id = A.A_Id
                and B.B_kind = 'type 2'
        )

答案 1 :(得分:1)

SELECT *
FROM A
JOIN B ON (A.A_id = B.A_id AND B.B_kind = 'type 1')

答案 2 :(得分:1)

我认为你想从A中排除A中的行,其中A类型为'type 2',A_id为'type 1'在B?

SELECT A.*
FROM A
INNER JOIN B as B1 ON (B1.A_id = A.A_id AND B1.B_kind = 'type 1')
LEFT JOIN B as B2 ON (B2.A_id = A.A_id AND B2.B_kind = 'type 2')
WHERE B2.A_id IS NULL

WHERE子句中的“IS NULL”确保只包含与“LEFT JOIN”不匹配的行。