Mysql 带标志条件的左连接查询

Mysql 带标志条件的左连接查询,mysql,sql,left-join,Mysql,Sql,Left Join,Hy,我在显示表的所有行时遇到问题cash,我试图获取cashassignment\u id列,如果该列没有数据,则打印未分配的。但是缺少Cash 1 我的sql: SELECT cash.cash_id, cash.cash_name, IFNULL(cash_assignments.cashassignment_id, 'Unallocated') AS cashassignment_id FROM cash LEFT JOIN cash_assignme

Hy,我在显示表的所有行时遇到问题
cash
,我试图获取
cashassignment\u id
列,如果该列没有数据,则打印
未分配的
。但是缺少
Cash 1

我的sql:

SELECT  
    cash.cash_id,
    cash.cash_name,
    IFNULL(cash_assignments.cashassignment_id, 'Unallocated') AS cashassignment_id
FROM cash
    LEFT JOIN cash_assignments USING(cash_id)
WHERE cash_assignments.cashassignment_valid = TRUE OR cash_assignments.cashassignment_valid IS NULL
演示链接

尝试将
where
条件移动到
on
子句:

SELECT c.cash_id, c.cash_name,
       COALESCE(ca.cashassignment_id, 'Unallocated') AS cashassignment_id
FROM cash c LEFT JOIN
     cash_assignments ca
     ON c.cash_id = ca.cash_id AND ca.cashassignment_valid = TRUE ;

我还修改了查询以使用表别名(更易于编写和读取查询),并使用
COALESCE()
而不是
ISNULL()
COALESCE()
是ANSI标准)。

您的查询在连接发生后过滤结果,因此您将过滤掉想要保留的内容。(如果我理解正确的话)

相反,您可以始终执行子查询:

SELECT K.X, L.Y FROM
    (SELECT X FROM A) AS K
LEFT JOIN
    (SELECT Y FROM B) AS L
USING (SOME_ID)
在子查询中,您可以添加where子句:

    (SELECT Y FROM B WHERE SOMECOND) AS L
这样,您可以在加入表之前过滤掉所需的行

将此应用于您的问题是微不足道的,留给感兴趣的读者作为练习。:)

通常,您不需要过滤子查询中的行,optmizer会这样做,这对于左侧(或者没有占位符,只需一个):

    A AS K