首先,我认为我的头衔并不好,但我想不出更好的头衔。请随时更改。
我有一个记录一对行的表。
以下是示例表结构。
表格历史记录
user_id row_1 row_2
2 1 2
2 1 3
表格行
row_id
1
2
3
4
5
6
我想查询只获取一对不在“历史记录”表中的行。
所以..我想得到以下结果。
行对:
1,4
1,5
1,6
2,3
2,4
2,5
2,6
and so on
我可以使用一个查询吗?
刚添加:
我刚刚提出了一个有效的查询,但我不确定其效果。
select r1.row_id, r2.row_id from rows as r1 cross join rows as r2
where r1.row_id!=r2.row_id and ( r1.row_id + r2.row_id) not in (select row_1 + row_2 from history)
order by r1.row_id desc
它会超级慢吗?
答案 0 :(得分:2)
像这样的东西。你没有在字段之间明确相关性,但这应该很容易适应。
select h.row_id r1, r.row_id r2
from rows h
cross join rows r
left join history h2 on h2.row_1=h.row_id and h2.row_2=r.row_id
where h2.row_1 is null
CROSS JOIN生成row_id x row_id
的所有可能组合
LEFT JOIN尝试在历史表中找到组合
WHERE子句选择未找到组合的位置
答案 1 :(得分:1)
我认为这可行:
SELECT DISTINCT
CASE WHEN r1.row_id < r2.row_id THEN r1.row_id ELSE r2.row_id END AS row_id_1,
CASE WHEN r1.row_id < r2.row_id THEN r2.row_id ELSE r1.row_id END AS row_id_2
FROM Rows AS r1
INNER JOIN Rows AS r2 /* ON r1.row_id <> r2.row_id */
WHERE (r1.row_id, r2.row_id) NOT IN (
SELECT row_1, row_2
FROM history
UNION
SELECT row_2, row_1
FROM history
)
ORDER BY 1, 2
返回:
1, 1
1, 4
1, 5
1, 6
2, 2
2, 3
2, 4
2, 5
2, 6
3, 3
3, 4
3, 5
3, 6
4, 4
4, 5
4, 6
5, 5
5, 6
6, 6
此查询将超级慢。