如果第二个表中的条件为真,则从第一个表中选择1个记录(所有引用行active = 0)

时间:2014-10-05 16:38:13

标签: mysql sql join phpmyadmin inner-join

我有两张桌子。 我想从第一张表中选择1条记录 条件在第二个表(active = 0)

中为真

表主管:

    -------------
    | id | name |
    -------------
    | 1  | abc1 |
    | 2  | abc2 |
    | 3  | abc3 |
    | 4  | abc4 |
    | 5  | abc5 |
    -------------

表LeadsDetails:

    -------------------------
    | id | lead_id | active |
    -------------------------
    | 1  | 1       | 1       |
    | 2  | 1       | 0       |
    | 3  | 2       | 0       |
    | 4  | 3       | 1       |
    | 5  | 4       | 0       |
    | 6  | 5       | 0       |
    | 7  | 5       | 0       |
    --------------------------

预期产出:

    --------------
    | id | name   |
    --------------
    | 2  | abc2   |
    | 4  | abc4   |
    | 5  | abc5   |
    --------------

SELECT `Lead`.`id`, `Lead`.`name`, `Lead`.`unsubscribe` 
FROM `leads` AS `Lead` inner JOIN `LeadsDetails` AS `LeadsDetails` 
ON (`LeadsDetails`.`lead_id` = `Lead`.`id`) 
WHERE `LeadsDetails`.`active` = 0

3 个答案:

答案 0 :(得分:2)

这应该比不存在更快地运行,因为子查询不会为每一行运行;在这种情况下,对于给定的ID,我计算表leaddetails上的活动字段值不为0的情况的数量,并且仅显示该计数为0的行(即,对于给定的id,活动字段始终为0 )

select l.id, l.name
  from lead l
  join leadsdetails ld
    on l.id = ld.lead_id
 group by l.id, l.name
having sum(case when ld.active <> 0 then 1 else 0 end) = 0

小提琴: http://www.sqlfiddle.com/#!2/00970/2/0

答案 1 :(得分:1)

因为只有在活动列没有1时才需要获取记录 使用NOT EXISTS

SQL FIDDLE DEMO:http://www.sqlfiddle.com/#!2/00970/1

SELECT * FROM
Lead L
WHERE NOT EXISTS (
  SELECT 1 FROM LeasdDetails LD
  where L.id = LD.lead_id
  AND LD.active =1
)

答案 2 :(得分:0)

我认为你可以用exists子句做你想做的事:

select l.*
from Lead l
where exists (select 1 from LeadsDetails ld where ld.lead_id = l.id and ld.active = 0)