【问题标题】:How to merge two arrays from SQL query? [closed]如何从 SQL 查询中合并两个数组? [关闭]
【发布时间】:2013-07-22 10:35:12
【问题描述】:

我有以下两个查询:

SELECT date( FROM_UNIXTIME( user_reg_date ) ) 'Current Date', COUNT( * ) 'registered_user'
FROM users
WHERE user_reg_date >=1341100800
AND user_reg_date <=1374451200
GROUP BY date( FROM_UNIXTIME( user_reg_date ) )

SELECT date( FROM_UNIXTIME( user_last_login ) ) 'Current Date', COUNT( * ) 'logged_in_user'
FROM users
WHERE user_last_login >=1341100800
AND user_last_login <=1374451200
GROUP BY date( FROM_UNIXTIME( user_last_login ) )

现在我想合并从上面查询中得到的两个数组,每个数组元素应该是下面的形式。

date = > array(registered_user, logged_in_user)

有人可以在这方面帮助我吗?提前致谢。

【问题讨论】:

    标签: php sql arrays associative-array array-merge


    【解决方案1】:

    您可以做一个非常简单的UNION ALL 并稍后使用SUM 按日期分组以获取值;

    SELECT DATE(FROM_UNIXTIME(date)) date, 
           SUM(registered_user) registered_user, 
           SUM(logged_in_user) logged_in_user
    FROM (
      SELECT user_reg_date date, 1 registered_user, 0 logged_in_user FROM users
      UNION ALL
      SELECT user_last_login,    0 registered_user, 1 logged_in_user FROM users
    ) a
    WHERE date >= 1341100800 AND date <= 1374451200
    GROUP BY DATE(FROM_UNIXTIME(date));
    

    【讨论】:

    • 再次感谢您。您的查询确实为我带来了魔力。我按照我的要求完美地工作了。我已经接受了你的回答,也投了赞成票。
    • :与上面的查询一样,我想获取相同的记录计数,其 reg_date 和 last_login 日期在本周、上周和最后两周内。我怎么能在 WHERE 条件下写这些东西?
    • 无法测试,但 WHERE YEARWEEK(FROM_UNIXTIME(date)) = YEARWEEK(NOW())WHERE YEARWEEK(FROM_UNIXTIME(date)) = YEARWEEK(DATE_SUB(NOW(), INTERVAL 1 WEEK)WHERE YEARWEEK(FROM_UNIXTIME(date)) &gt;= YEARWEEK(DATE_SUB(NOW(), INTERVAL 1 WEEK) 看起来很有希望。
    【解决方案2】:

    UNION点赞

    SELECT date( FROM_UNIXTIME( user_reg_date ) ) 'Current Date', COUNT( * ) 'registered_user'
    FROM users
    WHERE user_reg_date >=1341100800
    AND user_reg_date <=1374451200
    GROUP BY date( FROM_UNIXTIME( user_reg_date ) )
    
    UNION
    
    SELECT date( FROM_UNIXTIME( user_last_login ) ) 'Current Date', COUNT( * )   'logged_in_user'
    FROM users
    WHERE user_last_login >=1341100800
    AND user_last_login <=1374451200
    GROUP BY date( FROM_UNIXTIME( user_last_login ) )
    

    但要小心这两个表的重复列。尝试使用表对象调用它们,例如

    table1.id,table2.id
    

    考虑id 已经存在于两个表中。

    【讨论】:

    • 我试过了,但它只给出了 current_date 和 registered_user。实际上我想要一个数组中的两个计数。
    • 你忘了这样写,'as' COUNT( * ) as 'registered_user'
    • @phpLover: 是什么阻止你这样做?我在您的问题中看不到任何显示您实际尝试过的代码,因此让其他地方猜测答案然后告诉他们您已经尝试过,这有点不公平。你不这么认为吗?
    猜你喜欢
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 2016-05-26
    • 2019-02-16
    • 2020-07-08
    相关资源
    最近更新 更多