这是我的数据:
表1 ...
id
field1
field2
...
表2 ...
id
table1_original_id
table1_new_id
Table1保存了本身无法更新的记录,虽然我为用户构建了一种机制,可以“更新”它们......他们选择一条记录,进行更改,这些更改实际上是作为新记录提交的。为了对话,我们假设Table1中有10条记录,ID为1到10.用户提交ID 3的更新.ID 3保持原样,并且新记录ID 11被添加到Table1。除了这条新记录外,Table2获得了一条新记录,ID = 1,t1_original_id = 3,t1_new_id = 11。
SQL会选择从Table1中检索“对”记录...在这种情况下,查询将为我提供... ID 3和11。
抓头
我不认为数据库平台是Postgres 8.4并且我正在通过PHP检索数据以在jqGrid中处理。如果您可以指向我在单独的jqGrid中显示每对记录的方向,可以获得奖励积分!
感谢您的时间和精力。
===编辑===
以下是我需要根据上述场景从查询返回的内容示例:
id field1 field2
3 blah stuff
11 more things
一旦我有了这些对,我可以根据需要在PHP端进一步处理它们。
答案 0 :(得分:0)
您需要JOIN
到Table1
两次,例如:
SELECT orig.id AS Orig_ID
, orig.value AS Orig_Value
, n.id AS New_ID
, n.value AS New_Value
FROM Table2 a
JOIN Table1 AS orig
ON a.table1_original_id = orig.id
JOIN Table1 AS n
ON a.table1_new_id = n.id
演示:SQL Fiddle
更新: 要让它们按照您的需要进行配对而无需手动选择一组,您需要这样的东西:
SELECT sub.id,sub.value
FROM (SELECT a.id as Update_ID,o.id,o.value, '1' AS sort
FROM Table2 a
JOIN Table1 AS o
ON a.table1_original_id = o.id
UNION
SELECT a.id as Update_ID, n.id,n.value, '2' AS sort
FROM Table2 a
JOIN Table1 AS n
ON a.table1_new_id = n.id
) AS sub
ORDER BY Update_ID,sort
演示:Sql Fiddle
注意:将UNION
更改为UNION
+ ALL
,由于防火墙限制,无法将这些字词发送到彼此旁边。
硬编码的“1”和“2”使得原始版本始终出现在新版本之前。
答案 1 :(得分:0)
要获取两个单独的行(稍后在Q更新中指定),请使用UNION
查询:
SELECT 'old' AS version, t1.id, t1.field1, t1.field2
FROM table1 t1
JOIN table2 t2 ON t2.table1_original_id = t1.id
WHERE t2.id = $some_t2_id -- your t2.id here!
UNION ALL
SELECT 'new' as version, t1.id, t1.field1, t1.field2
FROM table1 t1
JOIN table2 t2 ON t2.table1_new_id = t1.id
WHERE t2.id = $some_t2_id; -- your t2.id here!
注意:这是一个查询
按要求返回,再加上 version
列,以便可靠地区分行:
version | id | field1 | field2
--------+----+--------+--------
old | 3 | blah | stuff
new | 11 | more | things
更复杂但更短更快的解决方案:
SELECT version, id, field1, field2
FROM (
SELECT unnest(ARRAY['old', 'new']) AS version
,unnest(ARRAY[table1_original_id, table1_new_id]) AS id
FROM table2 t2 WHERE t2.id = $some_t2_id -- your t2.id here!
) t2
JOIN table1 USING (id);
同样的结果。