mysql交叉表查询到php数组 - 而不是三个sql查询

时间:2011-10-20 17:33:21

标签: php mysql sql arrays

我想从mysql中的三个表中选择三列的总和,然后将其作为php数组。

表:

Amex:
incr_id,check_no, card_no, tip, total, date;
Mc:
incr_id,check_no, card_no, tip, total, date;
Visa
incr_id,check_no, card_no, tip, total,date ;

伪代码:

 $query = 
 select sum(tip) from Amex,
 select sum(tip) from Mc,
 select sum(tip) from Visa
 WHERE DATE(date) = CURDATE()

 mysql_fetch_array($query);

然后'foreach'或'while'将三个值输入php数组:

$ccpayments_tip['Amex']
$ccpayments_tip['Mc']      
$ccpayments_tip['Visa']

这是可能的,还是我必须执行三个选择查询? 谢谢!

3 个答案:

答案 0 :(得分:0)

您可以使用Union查询一次执行所有三个查询,并使用派生字段指示总和来自哪个表:

$sql = <<<EOL
SELECT 'Amex' AS source, SUM(tip) AS sum FROM Amex
UNION
SELECT 'MC' AS source, SUM(tip) AS sum FROM Mc
UNION
SELECT 'Visa' AS source, SUM(tip) AS sum FROM Visa

EOL;

$result = mysql_query($sql) or die(mysql_error());

$ccpayments_tip = array();
while($row = mysql_fetch_assoc($result)) {
    $ccpayments_tip[$row['source']] = $row['sum'];
}

当然,为什么你有三个单独的表?如果一个creditcard表格带有type字段来表明它是否为签证/ amex / mc,那会不会更有意义?

答案 1 :(得分:0)

您可以执行三个查询中的union

答案 2 :(得分:0)

你可以试试这样的事情

SELECT A.Amex, M.MC, V.Visa 
FROM 
   (SELECT SUM(tip) AS Amex FROM Amex WHERE DATE(date) = CURDATE()) AS A,
   (SELECT SUM(tip) AS Mc FROM Mc WHERE DATE(date) = CURDATE()) AS M,
   (SELECT SUM(tip) AS Visa FROM Visa WHERE DATE(date) = CURDATE()) AS V

更新:伪代码

/*
'*CARD TYPES            *PREFIX           *WIDTH
'American Express       34, 37            15
'Diners Club            300 to 305, 36    14
'Carte Blanche          38                14
'Discover               6011              16
'EnRoute                2014, 2149        15
'JCB                    3                 16
'JCB                    2131, 1800        15
'Master Card            51 to 55          16
'Visa                   4                 13, 16
*/   

SELECT SUM(tip), CASE
    WHEN card_no >= 4 AND card_no <= 5 THEN 'visa'
    WHEN card_no >= 51 AND card_no <= 56 THEN 'mc'
    WHEN card_no >= 34 AND card_no <= 38 THEN 'amex'
    ELSE NULL
END AS credit_card_type
FROM Amex, Mc, Visa
WHERE DATE(date) = CURDATE()
GROUP BY CASE
    WHEN card_no >= 4 AND card_no <= 5 THEN 'visa'
    WHEN card_no >= 51 AND card_no <= 56 THEN 'mc'
    WHEN card_no >= 34 AND card_no <= 38 THEN 'amex'
    ELSE NULL
END AS credit_card_type

没有测试任何查询只是一个例子,可能在框外思考

您的评论更新:

如果你要移动到交易数据库并存储card_type,你可以使用这样的查询:

SELECT SUM(tip)
FROM transaction_tbl
WHERE DATE(date) = CURDATE()
GROUP BY card_type
相关问题