mysql反身查询和fk连接

时间:2013-12-27 01:56:17

标签: mysql left-join

StackOverflow社区!我想知道你是否可以帮我解决这个问题:

我在这个表中有一个自反关系,并且连接到其他表。所以我想要检查子行和父母也没有孩子的那些在jasperreport中对它进行分组。仅插入父项,而不是package和product_idproduct的项是0。

所以问题是:是否有任何更简单的查询来实现我的目标?

products

idproduct
name
N1
.
.
N2
package bit// 1 if i'm a package, 0 if i'm not
product_idproduct // this one is the reflexivefield // 0 meaning no parent >0 the parent id


soldProducts
idproduct 
discount 
operationNumber 
quantity

这是我的第一个方法:

    SELECT 
    Pr.nombre ,
    Pr.precioventa ,
    pventas.cantidad,
    case
        when ( Pr.paquete=1 and Pr.productos_idproductos=0 )then pventas.cantidad * (pr.precioventa - ((pr.precioventa * pm.Modifier)))
        when ( Pr.paquete=0 and Pr.productos_idproductos>0 ) then 00.00
        when ( Pr.paquete=0 and Pr.productos_idproductos=0 )then pventas.cantidad * (pr.precioventa - ((pr.precioventa * pm.Modifier)))
    end 'Importe Articulo',
    Pr.productos_idProductos,pm.Modifier
FROM
    productosventas Pventas
        right JOIN
    productos Pr ON pventas.productos_idProductos = Pr.idProductos
        LEFT JOIN
    ventas V ON Pventas.ventas_idventa = V.idventa
        left join
    `pricemodifiers` pm ON Pventas.`PriceModifiers_idPriceModifier` = pm.`idPriceModifier` 
        left join
     productosventas Pventas2 on pr.productos_idproductos=pventas2.productos_idproductos
 where V.idventa=159
order by productos_idproductos

这个错过了子行。

第二种方法和答案!但你可以做得更短吗?

SELECT
    Pr.idProductos, 
    Pr.nombre,
    Pr.precioventa,
    pventas.cantidad,
    case
        when
            Pr.productos_idproductos = 0
                && Pr.paquete = 1
        then
            pventas.cantidad * (pr.precioventa - ((pr.precioventa * Pventas.PriceModifiers_idPriceModifier)))
        when
            Pr.productos_idproductos = 0
                && Pr.paquete = 0
        then
            pventas.cantidad * (pr.precioventa - ((pr.precioventa * Pventas.PriceModifiers_idPriceModifier)))

    end as 'Importe Articulo',case when 
     Pr.productos_idproductos = 0
                && Pr.paquete = 1
    then Pr.idProductos else pr.Productos_idproductos end as agrupador
FROM
    productosventas Pventas
        left JOIN
    productos Pr ON pventas.productos_idProductos = Pr.idProductos
        LEFT JOIN
    ventas V ON Pventas.ventas_idventa = V.idventa
        left join
    `pricemodifiers` pm ON Pventas.`PriceModifiers_idPriceModifier` = pm.`idPriceModifier`
where
    v.idventa = 159
union
SELECT 
   Pr.idProductos,Pr.nombre,
    Pr.precioventa,
    pventas.cantidad,
    case

        when
            Pr.productos_idproductos > 0
                && pr.paquete = 0
        then
            00.00
    end as 'Importe Articulo',case

        when
            Pr.productos_idproductos > 0
                && pr.paquete = 0
        then Pr.productos_idproductos else 0 end as agrupador
FROM
    productosventas Pventas
        inner JOIN
    productos Pr ON pventas.productos_idProductos = Pr.productos_idProductos

        left join
    `pricemodifiers` pm ON Pventas.`PriceModifiers_idPriceModifier` = pm.`idPriceModifier`
where
    Pventas.ventas_idventa = 159

0 个答案:

没有答案