如何选择这张桌子?

时间:2012-03-14 08:37:37

标签: php mysql arrays sql

我有这个数据库表'市场'

id       market_id       shows       clicks        event       data
 1          158          1000         300           on       2012-03-01
 2          158          1500         600           off      2012-03-14
 3          158          1500         600           on       2012-03-14
 4          158          2500         700           off      2012-03-20            

我想选择它并得到这样的数组:

$array  = array (
            array('from 2012-03-01 to 2012-03-14' => array('shows' => 500, 'clicks' => 300)
            array('from 2012-03-14 to 2012-03-20' => array('shows' => 1000, 'clicks' => 100)  

怎么做?我是在Mysql中这样做还是在php中执行此操作?

编辑:

数组中的

'shows'计算如此1500 - 1000,1500来自表'其中'event' off ,而1000来自表''event' on ,点击计算相同。

1 个答案:

答案 0 :(得分:2)

警告:我无法确定你的意图是什么,因此可能有更好的解决方案,但...... 这是一个适用于您的示例数据的查询。

SELECT
    t2.data as from_date,
    t1.data as to_date,
    (t1.shows-t2.shows) as shows,
    (t1.clicks - t2.clicks) as clicks
FROM `market` t1
    inner join market t2 
        on (t1.market_id=t2.market_id and t1.event='off' and t2.event='on' and t1.data>t2.data)
    left join market t3 
        on (t1.data>t3.data and t3.event='on' and t3.data>t2.data)
WHERE t3.id is null

稍微解释一下:查询将表连接到其自身以查找所有行对,其中一行表示晚于“on”事件的“off”事件。这将获得所有对(甚至2012-03-20'关闭'和2012-03-01'开启')然后我们再次进行LEFT JOIN以检查'on'行和之间没有其他'on'事件'关闭'一行。

不过,我认为你的样本结果有误。第二个结果中“显示”的值应为1000。