背景

我有三张表。raw, mapping 和 route。

其中 mapping 中记录了每一次 raw 的通知,raw_uid 和 notify_uid 多对多,每一次通知 notify_uid 在 route 表中可能对应多个渠道。

select route.id, raw.type 
from route r join mapping m on m.notify_uid=r.notify_uid
left join raw orgi on orgi.raw_uid = m.raw_uid
where  r.create_time between '2024-11-14 15:40:00' AND '2024-11-14 16:40:00'

主要是想查询 route 的基本信息,但是有些信息只有 raw 表才有。

但是发现结果出现笛卡尔积,如何改造才能避免笛卡尔积呢?

方式

SELECT 
    r.id, 
    (
        SELECT orgi.type 
        FROM raw orgi
        WHERE orgi.raw_uid = (
            SELECT m.raw_uid 
            FROM mapping m 
            WHERE m.notify_uid = r.notify_uid
            LIMIT 1
        )
    ) AS raw_type,
    (
        SELECT orgi.name 
        FROM raw orgi
        WHERE orgi.raw_uid = (
            SELECT m.raw_uid 
            FROM mapping m 
            WHERE m.notify_uid = r.notify_uid
            LIMIT 1
        )
    ) AS raw_name
FROM 
    route r
WHERE  
    r.create_time BETWEEN '2024-11-14 15:40:00' AND '2024-11-14 16:40:00';

可以通过这种方式,实现避免笛卡尔积。

参考资料