2013-05-15 47 views
2

我有2个表,一个包含大量数据行,另一个包含用户使用过的行。如何使用单个查询来允许我从主表中拉出3个项目,但只有给定用户之前没有见过的行。我将如何根据特定条件查询多个MySQL表?

实施例表是:

CREATE TABLE `main_index` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

insert into `main_index` set `id`='1', `name`='something1'; 
insert into `main_index` set `id`='2', `name`='something2'; 
insert into `main_index` set `id`='3', `name`='something3'; 
insert into `main_index` set `id`='4', `name`='something4'; 
insert into `main_index` set `id`='5', `name`='something5'; 

CREATE TABLE `seen_index` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` int(12), 
    `row_id` int(12), 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

insert into `seen_index` set `user_id`='1', `row_id`='3'; 
insert into `seen_index` set `user_id`='1', `row_id`='5'; 
insert into `seen_index` set `user_id`='2', `row_id`='1'; 
insert into `seen_index` set `user_id`='2', `row_id`='3'; 
insert into `seen_index` set `user_id`='2', `row_id`='4'; 

使用的USER_ID '1',由此,查询应返回:1,2,4

+0

我怎么没看到'USER_ID = 1'了一致预期结果'1,2,4' –

+0

基础上,2代表我给,USER_ID(1)已经看到根据seen_index,从main_index表之前的id 3和5。所以查询会返回user_id(1)还没有看到的来自main_index的行。 –

回答

4

该查询将工作:

SELECT 
* 
FROM 
main_index 
WHERE 
id NOT IN (
    SELECT row_id FROM seen_index WHERE user_id = 1 
) 

这里的fiddle

另一种方法是:

SELECT 
* 
FROM 
main_index 
WHERE 
NOT EXISTS (
    SELECT 1 FROM seen_index WHERE user_id = 1 AND row_id = main_index.id 
) 

这里的fiddle

+0

从来没有听说过SqlFiddle,谢谢! –

+0

这就是我需要的,谢谢罗斯 –