gpt4 book ai didi

php - 使用 Union All 添加按日期顺序回显 SQL 数据

转载 作者:行者123 更新时间:2023-11-29 11:49:31 25 4
gpt4 key购买 nike

因此,我正在与客户合作,实现一个与 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com