2

这是Table1数据。

USER_ID     |    PRODUCT_ID    |   TIMESTAMPS
------------+------------------+-------------
1015826235       220003038067     *1004941621*
1015826235       300003861266      1005268799
1015826235       140002997245      1061569397
1015826235      *210002448035*     1005542471

如果将 数据与Table1以下Table2数据进行比较,则PRODUCT_ID最后一行Table1数据ITEM_ID中的数据。Table2TIMESTAMPSTable1CREATED_TIMETable2

BUYER_ID     |    ITEM_ID         |   CREATED_TIME 
-------------+--------------------+------------------------
1015826235       220003038067       *2001-11-03 19:40:21*
1015826235       300003861266        2001-11-08 18:19:59
1015826235       140002997245        2003-08-22 09:23:17
1015826235      *200002448035*       2001-11-11 22:21:11

因此,在将 Table1 与 Table2 连接之后,我需要在上面的示例中显示这样的结果 - 以下输出中的任何一个对我来说都很好。

BUYER_ID    |     ITEM_ID       |    CREATED_TIME         |    PRODUCT_ID     |       TIMESTAMPS
------------+-------------------+-------------------------+-------------------+-----------------
1015826235       220003038067       *2001-11-03 19:40:21*      220003038067       *1004941621*
1015826235      *200002448035*       2001-11-11 22:21:11      *210002448035*       1005542471

或者

BUYER_ID   |     ITEM_ID       |    CREATED_TIME         |     USER_ID      |       PRODUCT_ID     |   TIMESTAMPS
-----------+-------------------+-------------------------+------------------+----------------------+------------------
1015826235       220003038067       *2001-11-03 19:40:21*      1015826235           220003038067       *1004941621*
1015826235      *200002448035*       2001-11-11 22:21:11       1015826235          *210002448035*       1005542471

任何帮助将不胜感激。

更新:-

select * from (select * from (select user_id, prod_and_ts.product_id as 
product_id, prod_and_ts.timestamps as timestamps from testingtable2 LATERAL VIEW
explode(purchased_item) exploded_table as prod_and_ts) prod_and_ts LEFT OUTER 
JOIN table2 ON ( prod_and_ts.user_id = table2.buyer_id AND table2.item_id =
prod_and_ts.product_id AND prod_and_ts.timestamps = UNIX_TIMESTAMP
(table2.created_time) ) where table2.buyer_id IS NULL) set_a LEFT OUTER JOIN
table2 ON (set_a.user_id = table2.buyer_id AND  ( set_a.product_id = 
table2.item_id OR set_a.timestamps = UNIX_TIMESTAMP(table2.created_time) ));
4

2 回答 2

1

我相信下面应该返回一个像你列出的第二个表一样的表。

SELECT T2.BUYER_ID, T2.ITEM_ID, '*'+T2.CREATED_TIME+'*' as CREATED_TIME, T1.USER_ID, T1.PRODUCT_ID, '*'+T1.TIMESTAMPS+'*' as TIMESTAMPS
FROM Table1 T1
    INNER JOIN Table2 T2 ON T1.USER_ID = T2.BUYER_ID
    AND T1.PRODUCT_ID = T2.ITEM_ID
    AND T1.TIMESTAMPS <> T2.CREATED_TIME
UNION
SELECT T2.BUYER_ID, '*'+T2.ITEM_ID+'*' as ITEM_ID, T2.CREATED_TIME, T1.USER_ID, '*'+T1.PRODUCT_ID+'*' as PRODUCT_ID, T1.TIMESTAMPS
FROM Table1 T1
    INNER JOIN Table2 T2 ON T1.USER_ID = T2.BUYER_ID
    AND T1.TIMESTAMPS = T2.CREATED_TIME
    AND T1.PRODUCT_ID <> T2.ITEM_ID

第一条语句获取 BUYER_ID 和 USER_ID 匹配、PRODUCT_ID 和 ITEM_ID 匹配但 TIMESTAMPS 和 CREATED_TIME 不匹配的所有行。

第二个获取 BUYER_ID 和 USER_ID 匹配、TIMESTAMPS 和 CREATED_TIME 匹配但 PRODUCT_ID 和 ITEM_ID 不匹配的所有行。

当然,如果有人多次购买相同的产品,或者有人同时购买 2 种不同的产品,这可能会造成混乱。

于 2012-07-09T06:04:53.027 回答
0

在我看来,您想在 USER_ID = BUYER_ID、PRODUCT_ID = ITEM_ID、TIME1 = TIME2 上 LEFT JOIN 两个表。

某些行将匹配所有三个字段并在所有三列中产生非空值。您要举报的其他人。

然后,您希望以相反的顺序对表运行相同的查询。

因此,您将在第一个表中拥有所有不匹配的行,在第二个表中拥有不匹配的行。

SELECT * from table1 LEFT JOIN table2 ON ( user_id = buyer_id AND item_id = product_id AND ts1 = ts2)
       WHERE buyer_id IS NULL
UNION
select * from table1 RIGHT JOIN table2 ON ( user_id = buyer_id AND item_id = product_id AND ts1 = ts2)
       WHERE product_id IS NULL;

我认为没有办法调和两者。通常,您甚至不确定两个查询中的行数是否相同。也许您可以在两个不匹配的集合之间运行第二个查询,注意共享 userid 和 productid 或 userid 和时间戳的行。但是您还应该跟踪共享的线路吗?

例如,获取不匹配集 1 并尝试根据产品 id 或时间戳将其与 table2 匹配(两者都无法匹配,或者第一个 JOIN 会匹配,并且buyer_id 不会为 NULL)

 SELECT * FROM
     ( SELECT table1.user_id, table1.product_id, table1.ts1 FROM table1 LEFT JOIN table2 
          ON ( user_id = buyer_id AND item_id = product_id AND ts1 = ts2) WHERE buyer_id IS NULL ) AS set_a
     LEFT JOIN table2
     ON ( set_a.user_id = table2.buyer_id AND 
        ( set_a.product_id = table2.item_id OR set_a.ts1 = table2.ts2 ));

与 table1 反向运行的相同操作会以另一种方式获取部分匹配项。

如果行的数量始终相同并且由用户 ID 匹配,则上面的查询将给出预期的结果。除了我在示例中将 ts1 和 ts2 定义为两个时间戳之外;时间戳和日期/时间之间的所有比较都需要适当的转换函数,例如

  ts1 = ts2

可能变成

  DATETIME(ts1) = ts2

或者

  ts1 = UNIX_TIMESTAMP(ts2)

等等,取决于 ts1 和 ts2 的实际定义和平台(例如,MySQL vs SQL Server vs PostgreSQL ...)。

于 2012-07-09T00:32:41.373 回答