信息
我目前正在创建一个历史记录/日志页面,该页面将显示用户在我的网站上的付款记录。
这两个表格为tasks
和payouts
tasks
是一个包含用户可以完成并赚钱的任务的表格。
我使用的返回列是tasks.title
,tasks.payment
和tasks.timestamp
payouts
是一个表,用于在用户支付其收入时保存信息。
我使用的返回列是payouts.processor
,payouts.amount
和payouts.timestamp
问题
我需要运行两个查询,合并它们(可能使用类型字段,以便在输出时使用foreach时可以轻松地显示它们)然后按时间戳DESC排序。
尝试
我唯一的尝试没有结果,我所做的只是运行两个查询,然后使用array_push
,它没有在数组的末尾添加任何内容。
问题
在添加名为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();
答案 0 :(得分: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();
答案 1 :(得分: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