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

标签 php mysql echo union-all

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

相关文章:

linux - 如何检查bash中是否提供了参数?

php - 检查数据库/文件夹中的重复图像和视频

php - 保护我的 PHP 页面免受未经授权的查询

mysql - 数据库和 wordpress 备份 cron 作业

php - 如何将证书内容存储到 WPLMS 上的数据库中 - Wordpress

php - 无法在 mySQL 列中保存今天的日期

linux - echo 输出格式不正确

php - 有没有办法在 Blade 中缓存变量?

php - 显示数组撇号内的回显

php - 如何在 php 中的 foreach 语句的每三个结果上输出一个值?