SQL select查询记录基于记录是否存在指向它的外键

时间:2018-03-05 18:01:18

标签: python mysql sql

我有一个"乘数"具有外键的表" push_id"指向"推动"中的记录表。这是一对多的关系。

有些推送记录不具有乘数,但其他人则有。我想要完成的是一个SQL查询,它选择具有乘数的最新推送记录,然后自己查询乘数。

类似的东西:

push_id = result_of("SELECT id FROM pushes ORDER BY ID DESC LIMIT 1 WHERE <multiplier record exists where push_id == id>")

multipliers = result_of("SELECT * FROM multipliers LIMIT 1 WHERE push_id == push_id")

print(multipliers)

我可能还想在推送上添加约束。因为我只想从某种类型的推动中获得乘数。

这里没有太多的SQL体验 - 任何帮助表示赞赏。 感谢。

更新

我尝试过以下方法:

SELECT * from 
(
    select m.*, p.type,
    from multipliers m
    inner join pushes p
    on m.push_id = p.id
    where p.type = 'CONSTANT'
) AS res1 where res1.push_id = ( 
    select max(push_id) from    
        (
            select m.push_id
            from res1
        ) AS res2
);

我收到此错误:

Error Code: 1146. Table 'res1' doesn't exist

2 个答案:

答案 0 :(得分:1)

由于您只对链接到乘数的推送感兴趣,因此可以在表之间没有连接的情况下实现。基于您自己的尝试的以下查询演示了一般的想法:

select *
from multipliers
where push_id is not null and
push_id = ( select max(push_id)
            from multipliers
          )

如果您想通过push_type进行约束,假设您的模型已规范化以仅在推送表中包含该信息,那么您将需要一个连接,例如:

select m.*
from multipliers m
inner join pushes p
on m.push_id = p.id
where p.type = 'Whatever push type'
and m.push_id = (
                  select max(push_id)
                  from multipliers
                );
  

编辑基于有问题的新要求,按push_type进行分区:

您可以使用嵌套成员资格测试扩展上一个查询,如下所示,以获得所需的结果

select m.*
from multipliers m
inner join pushes p
on m.push_id = p.id
where p.type = 'CONSTANT'
and m.push_id = (
                  select max(push_id)
                  from multipliers
                  where push_id in (
                                      select push_id
                                      from pushes
                                      where type = 'CONSTANT'
                                   )
                );

或者使用从初始查询派生的更简单的查询:

select *
from multipliers
where push_id = ( 
                  select max(push_id) 
                  from pushes 
                  where push_type = 'CONSTANT'
                ) 

答案 1 :(得分:0)

也许是这样的?

SELECT * FROM 
multipliers INNER JOIN pushes 
ON multipliers.push_id = pushes.push_id 
ORDER BY multipliers.push_id DESC 
LIMIT 1

INNER JOIN可确保您选择multiplier的{​​{1}}记录数据,其数据集按最大push排序。

根据您的评论,有关&#34;推送类型&#34;的其他条件,您可以使用:

push_id

<小时/>

编辑:

在更新您的问题后,您可能需要执行以下操作:

SELECT * FROM 
multipliers INNER JOIN pushes 
ON multipliers.push_id = pushes.push_id 
WHERE pushes.type = 'X'
ORDER BY multipliers.push_id DESC 
LIMIT 1