2015-12-14 70 views
0

我的两个查询:如何将两个查询与不同的WHERE/LIKE条件结合起来?

$compareTotals1 = mysqli_query($con," 
    SELECT *, (SUM(rent_amount)+SUM(late_fees)-SUM(discount_amount)) AS total, 
       SUM(late_fees) AS latefees, 
       SUM(discount_amount) AS discounts 
    FROM  transaction 
    WHERE  paid_on LIKE '%2014%' 
"); 
$compareTotals2 = mysqli_query($con," 
    SELECT *, (SUM(rent_amount)+SUM(late_fees)-SUM(discount_amount)) AS total, 
       SUM(late_fees) AS latefees, 
       SUM(discount_amount) AS discounts 
    FROM  transaction 
    WHERE  paid_on LIKE '%2015%' 
"); 

我如何输出结果:

if ($row = mysqli_fetch_array($compareTotals1)) { 
    echo CURRENCY.number_format($row['total'],2); 
    echo CURRENCY.number_format($row['latefees'],2); 
    echo CURRENCY.number_format($row['discounts'],2); 
} else { 
    echo "No Records."; 
} 

if ($row = mysqli_fetch_array($compareTotals2)) { 
    echo CURRENCY.number_format($row['total'],2); 
    echo CURRENCY.number_format($row['latefees'],2); 
    echo CURRENCY.number_format($row['discounts'],2); 
} else { 
    echo "No Records."; 
} 

paid_on LIKE '% %'通过下拉框和一些JavaScript动态生成的。这是变化的唯一部分。

我怎样才能凝结成一个查询这个,所以我只需要使用一个mysqli_fetch_array

+1

使用'Union'功能 – xQbert

+0

,如果你有超过生成查询的JavaScript控件,只需添加一个OR子句...... WHERE paid_on LIKE'%2015%'或paid_on LIKE'%2014%'' – pkm

+0

您是否需要这两个查询?如果下拉框填写年份,那么您只需要其中一个查询,但它会使用下拉列表中的年份...是的? –

回答

1

假设你想多行工会很可能在清洁

$compareTotals1 = mysqli_query($con," 
    SELECT *, (SUM(rent_amount)+SUM(late_fees)-SUM(discount_amount)) AS total, 
       SUM(late_fees) AS latefees, 
       SUM(discount_amount) AS discounts, 
       '2014' as Yr 
    FROM  transaction 
    WHERE  paid_on LIKE '%2014%' 
    UNION ALL 
    SELECT *, (SUM(rent_amount)+SUM(late_fees)-SUM(discount_amount)) AS total, 
       SUM(late_fees) AS latefees, 
       SUM(discount_amount) AS discounts, 
       '2015' as Yr 
    FROM  transaction 
    WHERE  paid_on LIKE '%2015%' 
"); 

您可以到这里的合并成一个OR并确保通过拼出一组或你不会知道这是2015年或2014年,除非*包括这些细节。

$compareTotals1 = mysqli_query($con," 
    SELECT *, (SUM(rent_amount)+SUM(late_fees)-SUM(discount_amount)) AS total, 
       SUM(late_fees) AS latefees, 
       SUM(discount_amount) AS discounts, 
       case when paid_on like '%2014%' then '2014' 
        when paid_on like '%2015%' then '2015' end as yr 
    FROM  transaction 
    WHERE  paid_on LIKE '%2014%' 
     OR  paid_on LIKE '%2015%' 
    --GROUP BY all fields from select relevant to group by... without structure and sample data from table can't figure out. 
    -- This might work though I'd be concerned all the * columns could be returning improper results. 
    GROUP BY case when paid_on like '%2014%' then '2014' when paid_on like '%2015%' then '2015' end 
"); 

也许...... group by case when paid_on like '%2014%' then '2014' when paid_on like '%2015%' then '2015' end但是这是非常具体的。

,我们也许能够按paid_on,但它似乎它不只是一年...所以你可能会得到每年多行......如此反复,而不对结构的样本数据想不出该怎么办。

或者,也许你想要一个交叉连接更多的列...不...行

$compareTotals1 = mysqli_query($con," 
    Select * from (
    SELECT *, (SUM(rent_amount)+SUM(late_fees)-SUM(discount_amount)) AS total, 
       SUM(late_fees) AS latefees, 
       SUM(discount_amount) AS discounts 
    FROM  transaction 
    WHERE  paid_on LIKE '%2014%') CROSS JOIN 

    (SELECT *, (SUM(rent_amount)+SUM(late_fees)-SUM(discount_amount)) AS total, 
       SUM(late_fees) AS latefees, 
       SUM(discount_amount) AS discounts 
    FROM  transaction 
    WHERE  paid_on LIKE '%2015%') B 
"); 
+0

'UNION'应该能够准确得到你想要的,但速度通常较慢。如果你能用'OR'得到你想要的东西,那应该会更好。 – Umbrella

+0

在大多数情况下,我可能会同意。然而在特定情况下''或''可以比'union'***更慢。 – xQbert

+0

有一次,我使用'OR',但是我没有使用'GROUP BY'这可能是我的问题。有什么办法可以将一个别名与'WHERE'关联起来并在'$ row [ '总']'? –

0

为什么不在你的WHERE中使用OR?

$compareTotals1 = mysqli_query($con," 
    SELECT *, (SUM(rent_amount)+SUM(late_fees)-SUM(discount_amount)) AS total, 
       SUM(late_fees) AS latefees, 
       SUM(discount_amount) AS discounts 
    FROM  transaction 
    WHERE  paid_on LIKE '%2014%' 
     OR  paid_on LIKE '%2015%' 
    GROUP BY YEAR(paid_on) -- is `paid_on` a date? 
"); 
+0

因为这会导致1记录不是2没有一个组(假设默认mySQL扩展组是由就地组成),并且按pay_on分组将不起作用,因为paid_on可能是%2014蓝%%2014 Red%然后我们'当每年出现多行时,只有2行可能是需要的。 – xQbert

相关问题