Mysql:从复杂表中检索数据

时间:2014-06-30 11:40:04

标签: mysql mysqli data-retrieval

enter image description here

搜索日期范围时,开始日期(date_reg)和结束日期(date_reg) ,mysql结果应该是每个main_table行包含每个产品的最新返回,接收,平衡

例如:在 10-01-2014 10-05-2014 之间,应检索日期内每件商品的价值

Client Id | Return         |  Received       |  Balance
          | prod 1  prod 2 |  prod 1  prod 2 |  prod 1  prod 2
--------------------------------------------------------------
1         | 2 [3]   2  [7] |  5       5      |  8       5
2         | 1 [5]   0  [8] |  5       5      |  9       3
3         | 0 [6]   1  [10]|  5       5      |  7       6

[id] ,其中 id 是sub_table的主键

<小时/> 我试过mysql查询

   SELECT p.product_name, ipd.id as ipd_id, i.id as i_id, ipd.*, i.*
   FROM main_table i 
   LEFT JOIN sub_table ipd ON ipd.main_table_id=i.id AND ipd.product_id IN (1,2) 
   LEFT JOIN product p ON ipd.product_id=p.id 
   WHERE ipd.date_reg IN (SELECT MAX(ipd1.date_reg) 
                       FROM sub_table ipd1 
                       WHERE ipd1.main_table_id=i.id  AND 
                       date_reg BETWEEN '10-01-2014' AND '10-05-2014')  
    ORDER BY cl.id ASC LIMIT 0, 20

它只返回每个客户的退货,收货和余额的单一产品

3 个答案:

答案 0 :(得分:1)

使用子查询WHERE&#39; ipd.date_reg IN&#39; SELECT MAX ...&#39;您只能根据您的数据获得1个条目 - 10-04-2014。工作正常。

答案 1 :(得分:1)

尝试在子查询中使用 GROUP BY

GROUP_CONCAT(expr); 有助于执行多对多信息,可用于将列值连接成单个字符串。

答案 2 :(得分:1)

我得到了输出。谢谢大家的帮助。

我使用GROUP_CANCAT将结果连接成一个用逗号分隔的字符串

 SELECT p.product_name, ipd.id as ipd_id, i.id as i_id, ipd.*, i.*,
 GROUP_CONCAT(product_id SEPARATOR ',') as group_product_id,
 GROUP_CONCAT(ipd.return SEPARATOR ',') as group_return,
 GROUP_CONCAT(ipd.received SEPARATOR ',') as group_received,
 GROUP_CONCAT(ipd.balance SEPARATOR ',') as group_balance  
 FROM main_table i 
 LEFT JOIN sub_table ipd ON ipd.main_table_id=i.id AND ipd.product_id IN (1,2) 
 LEFT JOIN product p ON ipd.product_id=p.id 
 WHERE ipd.date_reg IN (SELECT MAX(ipd1.date_reg) 
                   FROM sub_table ipd1 
                   WHERE ipd1.main_table_id=i.id  AND 
                   date_reg BETWEEN '10-01-2014' AND '10-05-2014'
                   GROUP BY ipd1.product_id)  
 ORDER BY cl.id ASC LIMIT 0, 20

结果

 Client Id | group_product_id | group_return | group_received | group_balance
 --------------------------------------------------------------------------
 1         | 1, 2             | 2, 2         |  5,5           |  8,5
 2         | 1, 2             | 1, 0         |  5,5           |  9,3
 3         | 1, 2             | 0, 1         |  5,5           |  7,6

然后可以将字符串分解为数组。