如何查询不在表中的行?

时间:2011-03-21 05:39:08

标签: mysql

首先,我认为我的头衔并不好,但我想不出更好的头衔。请随时更改。

我有一个记录一对行的表。

以下是示例表结构。

表格历史记录

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

它会超级慢吗?

2 个答案:

答案 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

此查询超级慢。