因此,我正在与客户合作,实现一个与 StackExchange 上的“徽章和特权系统”类似的系统。尽管在她的系统中,她希望为她的员工使用积分和奖励。这是相同的基本原理。用户因良好的团队合作而获得奖励积分,并从这些积分中获得奖励。我认为添加 SE 用于在顶部导航栏中显示这些内容的相同类型的功能会很方便,它会按照您获得其中任何一个的日期的顺序显示您的代表和徽章。这是我的问题,我找到了从两个单独的表中一起检索数据的帮助,但不确定如何按获得日期的顺序显示这些结果?举个例子:
用户 ID #1 在 2015 年 12 月 18 日获得了 50 点
将位于 ap_user_points
表中
用户 ID #1 已于“2015 年 12 月 17 日”获得“礼券”奖励
如果我简单地:
echo $row8['reward'] 。 $row8['points_added']
它会回显为:
礼券 50
我需要的地方按日期顺序排列为:
50
礼券
如果您查看导航栏中的代表和徽章图标,您就会明白我在这里得到的内容,这是一个类似的系统。
<?php
$user_id = $_SESSION['userid'];
$sql8 = "
SELECT r.reward_id,
r.user_id,
r.reward as reward,
r.date_earned as date_earned,
r.badge_desc,
NULL AS points_added,
NULL AS added_for,
NULL AS date_added
FROM ap_user_rewards as r
WHERE r.user_id = '$user_id'
UNION ALL
SELECT NULL,
NULL,
NULL,
NULL,
NULL,
p.points_added AS points_added,
p.added_for AS added_for,
p.date_added AS date_added
FROM ap_user_points as p
WHERE p.user_id = '$user_id' ORDER BY date_earned DESC, date_added DESC;";
$result8 = $conn->query($sql8);
if ($result8->num_rows > 0) {
// output data of each row
while($row8 = $result8->fetch_assoc()) {
////// NOT SURE WHAT TO ECHO HERE?
}
}
?>
最佳答案
向结果集中添加另一列。在该新列中,从两个查询中填充它...看起来它将是第一个查询中的 date_added
表达式和第二个查询中的 date_earned
表达式。当它们位于同一列时,排序就很容易。 (这还假设这些表达式具有相同或兼容的数据类型,最好是 DATE、DATETIME 或 TIMESTAMP。)
然后您可以按序数位置排序,例如ORDER BY 2
按结果集中的第二列进行排序。
SELECT a1
, b1
, NULL
, NULL
, a1 AS sortexpr
FROM ...
UNION ALL
SELECT NULL
, NULL
, x2
, y2
, x2 AS sortexpr
FROM ...
ORDER BY 5 DESC
<小时/>
这只是一种可能性。如果您无法添加额外的列来排列两个查询的表达式,那么您需要一种方法来区分哪个查询返回该行。我通常包含一个文字作为鉴别器列。
然后您可以使用隐式 UNION 语法,将查询括在括号中...
( SELECT 'q1' AS `source`
, a1
, b1 AS date_earned
, NULL
, NULL AS date_added
FROM ...
)
UNION ALL
( SELECT 'q2' AS `source`
, NULL
, NULL AS date_earned
, x2
, y2 AS date_added
FROM ...
)
ORDER BY IF(`source`='q1',date_earned,date_added) DESC
<小时/>
跟进
我可能误解了这个问题。我认为问题是如何从 UNION/UNION ALL 中获取以特定顺序返回的行。
就我个人而言,我会编写查询以包含鉴别器列,然后尽可能多地排列这些列,以便对它们进行相同的处理。
举个例子:
SELECT 'reward' AS `source`
, r.date_earned AS `seq`
, r.user_id AS `user_id`
, r.date_earned AS `date_earned`
, r.reward_id
, r.reward
, r.badge_desc
, NULL AS `points_added`
, NULL AS `added_for`
FROM r ...
UNION ALL
SELECT 'points' AS `source`
, p.date_added AS `seq`
, p.user_id AS `user_id`
, p.date_added AS `date_earned`
, NULL
, NULL
, NULL
, p.points_added AS `points_added`
, p.added_for AS `added_for`
FROM p ...
ORDER BY 2 DESC, 1 DESC
(可能实际上没有必要返回 user_id
,因为我们已经知道该值是什么。我在此处返回它是为了演示如何“排列两个结果集中的列” “。)
然后,当我获取行时...
if ( $row8['source'] == 'points' ) {
# process columns from a row of 'points' type
echo $row8['badge_desc'];
echo $row8['user_id'];
} elsif ( $row8['source'] == 'reward' ) {
# process columns from a row of 'reward' type
echo $row8['added_for'];
echo $row8['user_id'];
}
我就是这么做的。
关于php - 使用 Union All 添加按日期顺序回显 SQL 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34365184/