【问题标题】:Select result from two tables and combine result从两个表中选择结果并组合结果
【发布时间】:2013-01-24 16:59:11
【问题描述】:

给出以下示例表。

 CREDITS

 +-------+--------------+--------------+---------------------------+
 |   ID  |   userid     |     value    |  date_activated           |
 +-------+--------------+--------------+---------------------------+
 |   1   |   1722       |     50       |  2012-11-08 22:24:41      |
 +-------+--------------+--------------+---------------------------+
 |   2   |   3242       |     10       |  2012-11-07 22:24:41      |
 +-------+--------------+--------------+---------------------------+
 |   3   |   23232      |     20       |  2012-11-06 22:24:41      |
 +-------+--------------+--------------+---------------------------+
 |   4   |   1722       |     30       |  2012-11-19 22:24:33      |
 +-------+--------------+--------------+---------------------------+

 EXPENSE

 +-------+--------------+--------------+---------------------------+
 |   ID  |   userid     |     value    |  date_spent               |
 +-------+--------------+--------------+---------------------------+
 |   1   |   1722       |     10.20    |  2012-11-18 22:24:41      |
 +-------+--------------+--------------+---------------------------+
 |   2   |   3242       |     2.00     |  2012-11-03 22:24:41      |
 +-------+--------------+--------------+---------------------------+
 |   3   |   23232      |     20.00    |  2012-11-01 22:24:41      |
 +-------+--------------+--------------+---------------------------+
 |   4   |   1722       |     18.00    |  2012-11-20 22:24:33      |
 +-------+--------------+--------------+---------------------------+

我想达到以下结果。

 |   1722       |     50       |  2012-11-08 22:24:41      |
 |   1722       |     10.20    |  2012-11-18 22:24:41      |
 |   1722       |     30       |  2012-11-19 22:24:33      |
 |   1722       |     30       |  2012-11-19 22:24:33      |
 |   1722       |     18.00    |  2012-11-20 22:24:33      |
 |   3242       |     10       |  2012-11-07 22:24:41      |    
 |   3242       |     2.00     |  2012-11-03 22:24:41      |
 |   23232      |     20.00    |  2012-11-01 22:24:41      |
 |   23232      |     20.00    |  2012-11-01 22:24:41      |

我通常会如何执行以下操作

  $query = "SELECT * FROM CREDITS ORDER BY user id";
  $result = mysql_query($query);
  while ($row = mysql_fetch_array( $result ))
  {
       $combind_result = $combind_result.$row['userid']."|".$row['value']."|".$row['date_activated']."|"; 
       $user_id = $row['user_id'];
       $query2 = "SELECT * FROM EXPENSE userid = '$user_id' ORDER BY date_spent";
       $result2 = mysql_query($query2);
       while ($row2 = mysql_fetch_array( $result2 ))
           {
           $combind_result.$row2['userid']."|".$row2['value']."|".$row2['spent']."|"; 
           }
   }        

   echo $combind_result;

那里可能有一些拼写错误,但我认为它显示了这个概念。有没有更好的方法来做到这一点?

【问题讨论】:

  • 是时候开始学习一些SQL更强大的语法了,比如UNION

标签: php mysql


【解决方案1】:

尝试使用UNION ALL

SELECT user_id, value, date_activated FROM CREDITS
UNION ALL
SELECT user_id, value, date_activated FROM EXPENSE

您可能希望第二个选择阅读:

SELECT user_id, value * -1, date_activated FROM EXPENSE,这样您就可以正确计算信用与费用之间的关系。您还可以添加代码以进一步帮助区分信用和费用。

SELECT user_id, value, date_activated, 'c' as `type` FROM CREDITS
UNION ALL
SELECT user_id, value * - 1, date_activated,'e' as `type` FROM EXPENSE

【讨论】:

    【解决方案2】:

    看看UNION MYSQL CLAUSE 。 就是这样。

    (SELECT a FROM t1 ORDER BY a LIMIT 10)
    UNION
    (SELECT a FROM t2 ORDER BY a LIMIT 10);

    【讨论】:

    • UNION 可能会忽略看起来像重复的行。在这种情况下尝试UNION ALL
    【解决方案3】:

    试试这个:

        SELECT user_id, value,date
        FROM
          ( SELECT id,
                   user_id,
                   value,
                   date_activated AS date
           FROM credits
           UNION ALL SELECT id,
                        user_id,
                        value,
                        date_spend AS date
           FROM expense ) x
        ORDER BY id, date; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-07
      • 1970-01-01
      • 2014-01-19
      • 2013-11-28
      • 2021-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多