mysql只左连接基表的第一行

mysql只左连接基表的第一行,mysql,sql,left-join,Mysql,Sql,Left Join,我正在努力思考如何将数据从一个表连接到基表。。但仅针对基表的第一行。。。这可能吗 例如: 表1 表2由ID、日期[非日期时间]和值左连接 item_id | drop_datetime | value --------------------------------------- 2 | 1/1/2014 00:00:00 | 65 3 | 9/8/2014 00:00:00 | 33 我需要这样做: SELECT t1.item_id ,

我正在努力思考如何将数据从一个表连接到基表。。但仅针对基表的第一行。。。这可能吗

例如:

表1

表2由ID、日期[非日期时间]和值左连接

item_id  |   drop_datetime   |  value  
---------------------------------------
   2     | 1/1/2014 00:00:00 |   65
   3     | 9/8/2014 00:00:00 |   33
我需要这样做:

SELECT t1.item_id
, t1.insert_datetime as inserted
, t1.value as ins_value
##
, t2.drop_datetime as cancelled
, t2.value as cld_value
##
FROM table1 t1
##
LEFT JOIN table2 t2
ON t2.item_id = t1.item_id
AND date(t2.drop_datetime) = date(t1.insert_datetime)
AND t1.value = t2.value
##
WHERE 1=1
这意味着我需要知道哪些值被取消了。。。但在项目_id=2的情况下,出现以下情况:

商品于2014年1月1日12:54:05装运,价值65。。。由于参数错误,T2第1行被取消,并于2014年1月12日12:57:05以相同的值重新发货

对于项目_id=2,我得到的是:

但我需要得到这个:

item_id  |     inserted      |  ins_value |  cancelled        |   cld_value
-----------------------------------------------------------------------------
   2     | 1/1/2014 12:54:05 |     65     | 1/1/2014 00:00:00 |      65
   2     | 1/1/2014 12:57:05 |     65     |                   |       
因为事实上,只有第一次被取消。。在MySQL中有可能得到这个结果吗

注:不幸的是,一个项目也可能在一小时内取消两三次

                                   **EDIT 1**
如果有帮助的话。。。所有数据都在一个表中,症状为SHIP1或CANCLED2

源表

这有用吗

                                   **POSSIBLE SOLUTION**
Ít看来这是可行的:

SELECT t1.item_id
, t1.insert_datetime as inserted
, t1.value as ins_value
##
, t2.drop_datetime as cancelled
, t2.value as cld_value
##
FROM table1 t1
##
LEFT JOIN table2 t2
ON t2.item_id = t1.item_id
AND date(t2.drop_datetime) = date(t1.insert_datetime)
AND t1.value = t2.value
AND t1.id < t2.id   ## <- this should do the trick
##
WHERE 1=1
你可以试试这个

SET @rowNoIn:=0;
SET @RowNoCn:=0;
SET @itemIn='';
SET @itemCn='';

select i.*,c.*
from(
  SELECT 
    @rowNoIn:=CASE WHEN @itemIn=item_id THEN @rowNoIn+1 ELSE 1 END AS rowNo
    ,@itemIn:=item_id AS item_id
    ,insert_datetime
    ,value
  FROM table1
  ORDER BY item_id, insert_datetime
)i
left join (
  SELECT 
    @rowNoCn:=CASE WHEN @itemCn=item_id THEN @rowNoCn+1 ELSE 1 END AS rowNo
    ,@itemCn:=item_id AS item_id
    ,drop_datetime
    ,value
  FROM table2
  ORDER BY item_id, drop_datetime)c
on 
  i.item_id = c.item_id
  and i.rowNo = c.rowNo
注意:如果有项目取消,它假设第一个项目表单表1将被取消,无论您可以在什么日期更新代码以更好地满足您的需要,但希望它将引导您进入正确的方向。您应该考虑将ID添加到表1中,以便可以显式地引用取消的记录。

< P>可以尝试:

MySQL 5.5.32架构设置:

问题1:


你怎么知道只有第一个被取消了?我认为数据模型是错误的。表2中的itemid应该指向一个唯一的id,这样您就知道哪一个被取消了。目前,没有很好的方法来确定这一点,您需要猜测业务规则并编写一个不必要的复杂查询来解决该问题。我不知道这一点。。。我想。。。但它应该是第二个。。。事实上,没关系。。我需要看看有多少项目被取消了,有多少项目没有。。。但是-详细地说:我同意数据模型是错误的,但是我没有机会改变它:我已经添加了更多关于原始结构的信息。。也许这和我的解决方案一样:非常好
                                   **POSSIBLE SOLUTION**
SELECT t1.item_id
, t1.insert_datetime as inserted
, t1.value as ins_value
##
, t2.drop_datetime as cancelled
, t2.value as cld_value
##
FROM table1 t1
##
LEFT JOIN table2 t2
ON t2.item_id = t1.item_id
AND date(t2.drop_datetime) = date(t1.insert_datetime)
AND t1.value = t2.value
AND t1.id < t2.id   ## <- this should do the trick
##
WHERE 1=1
SET @rowNoIn:=0;
SET @RowNoCn:=0;
SET @itemIn='';
SET @itemCn='';

select i.*,c.*
from(
  SELECT 
    @rowNoIn:=CASE WHEN @itemIn=item_id THEN @rowNoIn+1 ELSE 1 END AS rowNo
    ,@itemIn:=item_id AS item_id
    ,insert_datetime
    ,value
  FROM table1
  ORDER BY item_id, insert_datetime
)i
left join (
  SELECT 
    @rowNoCn:=CASE WHEN @itemCn=item_id THEN @rowNoCn+1 ELSE 1 END AS rowNo
    ,@itemCn:=item_id AS item_id
    ,drop_datetime
    ,value
  FROM table2
  ORDER BY item_id, drop_datetime)c
on 
  i.item_id = c.item_id
  and i.rowNo = c.rowNo
CREATE TABLE Table1
    (`id` int, `item_id` int, `insert_datetime` datetime, `value` int, `symptom` int)
;

INSERT INTO Table1
    (`id`, `item_id`, `insert_datetime`, `value`, `symptom`)
VALUES
    (1, 2, '2014-01-01 12:54:05', 65, 1),
    (2, 2, '2014-01-01 00:00:00', 65, 2),
    (3, 2, '2014-01-01 12:57:05', 65, 1),
    (4, 3, '2014-07-08 10:01:47', 87, 1),
    (5, 3, '2014-08-09 09:37:21', 33, 1),
    (6, 3, '2014-08-09 00:00:00', 33, 2),
    (7, 3, '2014-08-09 09:42:21', 33, 1),
    (8, 3, '2014-08-09 00:00:00', 33, 2),
    (9, 3, '2014-08-09 09:48:29', 33, 1),
    (10, 3, '2014-09-02 15:22:01', 58, 1)
;
SELECT DISTINCT t1.item_id
, t1.insert_datetime as inserted
, t1.value as ins_value
, ifnull(t2.insert_datetime,'') as cancelled
, ifnull(t2.value,'') as cld_value
FROM table1 t1
LEFT JOIN table1 t2
ON t2.item_id = t1.item_id
AND date(t2.insert_datetime) = date(t1.insert_datetime)
AND t1.value = t2.value
AND t1.id < t2.id 
AND t2.symptom = 2
WHERE t1.symptom = 1 
| ITEM_ID |            INSERTED | INS_VALUE |           CANCELLED | CLD_VALUE |
|---------|---------------------|-----------|---------------------|-----------|
|       2 | 2014-01-01 12:54:05 |        65 | 2014-01-01 00:00:00 |        65 |
|       2 | 2014-01-01 12:57:05 |        65 |                     |           |
|       3 | 2014-07-08 10:01:47 |        87 |                     |           |
|       3 | 2014-08-09 09:37:21 |        33 | 2014-08-09 00:00:00 |        33 |
|       3 | 2014-08-09 09:42:21 |        33 | 2014-08-09 00:00:00 |        33 |
|       3 | 2014-08-09 09:48:29 |        33 |                     |           |
|       3 | 2014-09-02 15:22:01 |        58 |                     |           |