如何在join中访问外部表数据

时间:2018-04-30 17:18:43

标签: mysql sql database

如何从SELECT中的外表访问数据,并在JOIN结构内的WHERE中使用它?

以下是当前查询:

    SELECT
        cvl.id caracteristica_valor_id,
        cvl.nome caracteristica_valor_nome,
        cvl.valor caracteristica_valor_valor,
        ctp.id caracteristica_tipo_id,
        ctp.nome caracteristica_tipo_nome,
        ctp.codigo caracteristica_tipo_codigo,
        ctp.tipo caracteristica_tipo_tipo,
        COUNT(DISTINCT var.id_perfil_produto) quantidade_itens
    FROM
        caracteristica_variacao cvr
    INNER JOIN caracteristica_valor cvl ON  cvl.id = cvr.id_caracteristica_valor
    INNER JOIN caracteristica_tipo ctp ON ctp.id = cvl.id_caracteristica_tipo
    INNER JOIN variacao var ON var.id = cvr.id_variacao
    INNER JOIN(
        SELECT DISTINCT
            ppr.id perfil_produto_id
        FROM
            perfil_produto ppr
        INNER JOIN produto pro ON pro.id = ppr.id_produto
        INNER JOIN(
            SELECT ppr2.id AS id_perfil_sub,a
                COUNT(var.id) AS qtd_variacoes,
                SUM(var.quantidade_estoque) AS quantidade_estoque,
                COALESCE(SUM(var.quantidade_estoque_reservada),0) AS quantidade_estoque_reservada,
                MIN(var.disponibilidade) AS disponibilidade,
                MIN(var.frete_gratis) AS frete_gratis,
                MIN(var.preco_venda) AS preco_venda,
                MAX(var.preco_listagem) AS preco_listagem
            FROM
                variacao var
            LEFT JOIN perfil_produto ppr2 ON ppr2.id = var.id_perfil_produto
            LEFT JOIN caracteristica_variacao cvr_1 ON cvr_1.id_variacao = var.id
            LEFT JOIN caracteristica_valor cvl_1 ON cvl_1.id = cvr_1.id_caracteristica_valor
            LEFT JOIN caracteristica_tipo ctp_1 ON ctp_1.id = cvl_1.id_caracteristica_tipo
            WHERE
                var.disponibilidade = 1
                AND(
                    ctp_1.codigo = 'tamanho' AND cvl_1.valor IN('p')
                )
            GROUP BY
                ppr2.id
        ) AS grp_var ON grp_var.id_perfil_sub = ppr.id
        INNER JOIN produto_categoria prc ON pro.id = prc.produto_id
        INNER JOIN categoria cat ON prc.categoria_id = cat.id
        WHERE
            pro.disponibilidade = 1 AND prc.categoria_id IN (164, 165, 166)
     ) AS produto ON produto.perfil_produto_id = var.id_perfil_produto
    GROUP BY
        cvl.id
    ORDER BY
        ctp.tipo ASC,
        ctp.id

我需要来自此部分内外表的字段ctp.codigo

WHERE
    var.disponibilidade = 1
    AND(
        ctp_1.codigo = 'tamanho' AND cvl_1.valor IN('p')
    )

本节如下:

WHERE
    var.disponibilidade = 1
    AND(
        (ctp.codigo != 'tamanho' AND ctp_1.codigo = 'tamanho' AND cvl_1.valor IN('p'))
        OR
        (ctp.codigo = 'tamanho')
    )

1 个答案:

答案 0 :(得分:0)

无法从内联视图查询中引用外部查询中的列。

在MySQL版本中,内联视图查询称为"派生表"。由于MySQL处理它的方式,这个名称是有道理的。执行计划首先将内联视图查询实现为临时(-ish)表。完成后,外部查询可以运行,引用派生表的内容。

在内联视图查询运行时,MySQL没有提供外部查询中的列。

可以在子查询中引用外部查询中的列,例如在SELECT列表或WHERE子句中。我们调用一个子查询来引用外部查询a"相关子查询"中的列。