【问题标题】:Sql query to get Expected output获取预期输出的 Sql 查询
【发布时间】:2021-07-24 14:44:52
【问题描述】:

我有三个名为 device_table、playlist_table 和 device_playlist_assoc 的表

device_playlist_assoc 表用于将设备与播放列表关联起来。

device_table

device_id device_name
d1 device1
d2 device2
d3 device3
d4 device4
d5 device5
d6 device6

播放列表表

playlist_id playlist_name
p1 playlist1
p2 playlist2
p3 playlist3

device_playlist_assoc

dpa_id dpa_device_id dpa_playlist_id
1 d1 p1
2 d1 p2
3 d2 p1
4 d2 p3
5 d3 p4
6 d4 p5

所以,我想要的 O/P 是那些没有 playlist1 的设备。我只从前端获取 playlist_id 作为参数。所以我想要一个 sql 查询,它可以只根据这个 playlist_id 给我预期的输出。即无论我从前端获得什么 playlist_id,我都应该能够获得不包含该播放列表的设备的 device_id + 那些也不包含任何播放列表的设备。

预期 O/P

device_id
d3
d4
d5
d6

我尝试使用左外连接,但没有得到预期的 o/p。有人可以帮忙吗?谢谢。

【问题讨论】:

    标签: mysql sql database join left-join


    【解决方案1】:

    你可以这样做:

    select * 
    from device_table
    where device_id not in (select device_id 
                            from device_playlist_assoc
                            where playlist_id = 1)
    

    【讨论】:

    • Answer 与上面的表示例不匹配,尤其是在子查询中。 (从 device_playlist_assoc 中选择 dpa_device_id 其中 dpa_playlist_id='p1')
    【解决方案2】:

    我会推荐not exists

    select d.*
    from device_table d
    where not exists (select 1
                      from device_playlist_assoc dp
                      where dp.dpa_device_id = d.device_id and
                            dp.dpa_playlist_id = ?
                     );
    

    ? 是从应用程序代码传入的 id 的参数占位符。

    我更喜欢not exists 而不是not in,原因有两个:

    1. 如果子查询返回 NULL 值,它的行为与您预期的一样。
    2. 使用索引很容易优化(在本例中为device_playlist_assoc(dpa_device_id, dpa_playlist_id)

    不过,我推测您可能希望通过名称而不是 ID 来引用播放列表。如果是这种情况,您可以在子查询中使用join

    select d.*
    from device_table d
    where not exists (select 1
                      from device_playlist_assoc dp join
                           playlist_table p
                           on dp.dpa_playlist_id = p.playlist_id
                      where dp.dpa_device_id = d.device_id and
                            p.playlist_name  = ?
                     );
    

    在这种情况下,? 是名称的参数占位符,而不是 id

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多