mysql只左连接基表的第一行
我正在努力思考如何将数据从一个表连接到基表。。但仅针对基表的第一行。。。这可能吗 例如: 表1 表2由ID、日期[非日期时间]和值左连接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 ,
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 | | |