1

信息

我目前正在制作一个历史/日志页面,该页面将显示用户在我的网站上的付款历史。

这两个表是taskspayouts

tasks是一张表,里面有用户可以完成并赚钱的任务。我使用的返回的列是tasks.title,tasks.paymenttasks.timestamp

payouts是一个在用户支付收入时保存信息的表格。我使用的返回的列是payouts.processor,payouts.amountpayouts.timestamp

问题

我需要运行这两个查询,合并它们(可能使用类型字段,以便在输出上使用 foreach 时可以轻松地以不同方式显示它们),然后按时间戳 DESC 排序。

试图

我唯一的尝试没有结果,我所做的只是运行两个查询,然后使用array_pushwhich 没有在数组末尾添加任何内容。

问题

在添加一个名为的字段时合并两个查询结果的最佳方法是什么,LOG_TYPE所以在输出时我可以做这样的事情

foreach($data as $row){
    if($row['LOG_TYPE'] == 1){
        // Display Payout
    }    else    {
        // Display Task
    }
}

结论

任何问题都将尽快得到答复,任何修改都将显示在下方。谢谢你。

编辑

根据要求,这是我正在使用的两个查询。

    $STH = $this->database->prepare('SELECT * FROM tasks WHERE completed_by = :userid  ORDER BY timestamp DESC');
    $STH->execute(array(':userid' => $user));
    $data = $STH->fetchAll();

    $STH = $this->database->prepare('SELECT * FROM payouts WHERE user = :userid ');
    $STH->execute(array(':userid' => $user));
    $payouts = $STH->fetchAll();
4

2 回答 2

1

不要使用 *. 基本上你想要这个,它会给你 4 列(log_type、field1、field2、timestamp):

SELECT 1 as log_type, tasks.title as field1 , tasks.payment AS field2, tasks.timestamp
FROM tasks
WHERE completed_by = 'foo'
UNION
SELECT 2, payouts.processor, payouts.amouny, payouts.timestamp
FROM payouts
WHERE user = 'bar'
ORDER BY timestamp DESC';

试试这个

$STH = $this->database->prepare('SELECT 1 as log_type, tasks.title as field1 , tasks.payment AS field2, tasks.timestamp
                                 FROM tasks
                                 WHERE completed_by = :userid
                                 UNION
                                 SELECT 2, payouts.processor, payouts.amount and payouts.timestamp
                                 FROM payouts
                                 WHERE user = :userid
                                 ORDER BY timestamp DESC');
$STH->execute(array(':userid' => $user));
$payouts = $STH->fetchAll();
于 2013-11-14T12:40:19.890 回答
0

正如 AgRizzo 评论的那样,尝试一个简单的 UNION https://dev.mysql.com/doc/refman/5.0/en/union.html

运行 UNION 时,您的第一个查询设置字段的名称,您可以添加其他字符串。所以,一个伪示例:

SELECT "1" AS `log_type`, tasks.title, tasks.payment, tasks.timestamp
FROM tasks
WHERE tasks.user_id = 12
UNION
SELECT "2", payouts.processor, payouts.amount , payouts.timestamp
FROM payouts
WHERE payouts.user_id = 12
ORDER BY 4
于 2013-11-14T12:42:18.680 回答