2

これはTable1データです。

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

Table1データを下のデータと比較すると、 データの最後の行のデータは下のデータの最後の行のデータと一致しておらずTable2、データの最初の行のデータもデータの最初の行のデータと一致していません。データ。PRODUCT_IDTable1ITEM_IDTable2TIMESTAMPSTable1CREATED_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

以下は、リストした2番目のテーブルのようなテーブルを返すはずです。

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

The first statement gets all the rows where the BUYER_ID and USER_ID match, the PRODUCT_ID and ITEM_ID match, but the TIMESTAMPS and CREATED_TIME do NOT match.

The second gets all the rows where the BUYER_ID and USER_ID match, the TIMESTAMPS and CREATED_TIME match, but the PRODUCT_ID and ITEM_ID do NOT match.

This, of course, will could messy if someone buys the same product more than once, or if someone buys 2 different products at the exact same time.

于 2012-07-09T06:04:53.027 に答える
0

USER_ID = BUYER_ID、PRODUCT_ID = ITEM_ID、TIME1=TIME2の2つのテーブルを左に結合したいと思います。

一部の行は3つのフィールドすべてで一致し、3つの列すべてでnull以外の値を生成します。あなたが報告したい他の人。

次に、テーブルを逆の順序で使用して同じクエリを実行します。

したがって、最初のテーブルには一致しない行がすべてあり、2番目のテーブルには一致しない行があります。

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;

2つを調整する方法はないと思います。一般に、2つのクエリで同じ数の行を使用するかどうかは定かではありません。おそらく、一致しない2つのセット間で2番目のクエリを実行し、useridとproductid、またはuseridとtimestampを共有する行に気付くことができます。しかし、どちらも共有していない回線も追跡する必要がありますか?

たとえば、一致しないセット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を2つのタイムスタンプとして定義したことを除いて。タイムスタンプと日付/時刻のすべての比較には、適切な変換関数が必要です。

  ts1 = ts2

になるかもしれない

  DATETIME(ts1) = ts2

また

  ts1 = UNIX_TIMESTAMP(ts2)

ts1とts2の実際の定義とプラットフォームに応じて、など(たとえば、MySQLとSQL ServerとPostgreSQL...)。

于 2012-07-09T00:32:41.373 に答える