首页 > 解决方案 > 查询选择多个表

问题描述

你好,

我需要选择所有COMISSIONARIO和所有FATURA 的他们。但我不知道怎么做。我尝试了一个如下图所示的查询,但它不起作用。它显示了所有的FATURA,但只有一个FATURACOMISSIONARIO

询问

图表

标签: mysqljoinselect

解决方案


我正在根据某些状态从您的最终 WHERE 子句开始稍微反转您的查询。由于 Comissionario 表在状态上是 WHERE “必需”,因此我将其移至查询的第二个位置。然后将其余的表返回到 fatura 表。

select
        f.valor valor_fatura,
        f.numero numero,
        f.id_cliente,
        des.nome despachante,
        v.nome vendedor,
        tipo.tipo tipo_commisionado,
        u.unidade unidade_cobranca,
        com.valor_comissao taxa,
        if( u.unidade = 'moeda',
                com.valor_comissao,
                FORMAT(( ( com.valor_comissao * f.valor ) / 100 ), 2 )
            ) valor_comissao,
        f.created_at,
        f.updated_at,
        f.created_by,
        f.updated_by
    from
        -- start with all commisionario status (alias cs)
        ComissionarioStatus cs
            -- now on to comissionario (alias com) that match key status
            JOIN comissionario com
                on cs.id_comissionariostatus = com.id_comissionariostatus
                -- now the tipo and unicob with shorter alias
                left join ComissionarioTipo tipo
                    on com.id_comissionariotipo = tipo.id_comissionariotipo
                left join Unicob u
                    on com.id_unicob = u.id_unicob
                -- now getting the individual
                join Individuo des
                    on com.id_comissionado = des.id_individuo
                    join captacao cap
                        on des.id_individuo = cap.id_despachante
                        left join proposta p
                            on cap.id_proposta = p.id_proposta
                            left join Individuo v
                                on p.id_vendedor = v.id_individuo
                        join fatura f
                            on cap.id_captacao = f.id_captacao 
    where
        -- where the one status you want
        cs.status = 'ativo'     

这只是一个开始,但是如果您查看您的查询,您会尝试查找与 Comissionario 记录相关联的 Fatura 记录,因此要获取其中的每一个,您需要一个常规的 JOIN 来将记录拉到一起。

此外,如果您查看表格的缩进级别,您可以看到我是如何从一个表格跳到下一个表格的,以及左侧表格(第一个表格)中的 ID 键如何与右侧表格上的 ID 匹配(第二个表格)表加入 TO)。我相信看到 A -> B -> C,您首先要保证表之间的关系。可选的将是左连接,就像您最初在某些上所做的那样。但是由于您的 where 子句是基于特定状态的,这会强制任何左连接进入 comissionario 表以进行 JOIN。所以现在,要从那个回到 fatura,每个后续关联也需要是一个 JOIN 与左连接。

现在,说了这么多,让我们尝试澄清您在最终输出中寻找的内容。您的图表显示了许多表格和关系,但请退后一步。您需要什么零件......来自 Comissionario 桌子和 Fatura 桌子的东西?如果是这样,请提供从一个到另一个的关系表的最短链接。这些都将是直接的 JOIN 条件。以此开始您的查询。一旦你解决了这个问题,现在开始在适用的情况下使用左连接来附加其他元素。例如,接下来我将添加具有特定状态的 ComissionarioStatus 表。

当您逐渐使用 JOIN 或 LEFT JOIN 添加每个附加表时,找出哪个破坏了您期望的结果集并问自己为什么...应该是 LEFT JOIN 吗?或不。

对表使用更短但更有意义的别名也有帮助。


推荐阅读