2013-06-01 116 views
0

我有一个快速问题。我在数据库中有下表。mysql查询排除重复记录

CREATE TABLE IF NOT EXISTS `wp_agp_settings_data` (
    `ID` int(50) NOT NULL AUTO_INCREMENT, 
    `agp_user_id` int(10) NOT NULL, 
    `agp_order_id` int(10) NOT NULL, 
    `agp_blog_id` int(10) NOT NULL, 
    `agp_keywords` varchar(255) NOT NULL, 
    `agp_keywords_date` varchar(20) NOT NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ; 

INSERT INTO `wp_agp_settings_data` (`ID`, `agp_user_id`, `agp_order_id`, `agp_blog_id`, `agp_keywords`, `agp_keywords_date`) VALUES 
(1, 2, 5, 4, 'keyword1', '1369872000'), 
(2, 2, 0, 6, 'keyword2', '1369872000'), 
(3, 2, 0, 3, 'masterkey', '1369872000'), 
(4, 2, 0, 4, 'testkey', '1369872000'); 

我想只得到不同的agp_blog_ids。 到目前为止,我这样做:

SELECT agp_blog_id 
FROM wp_agp_settings_data 
WHERE 
     agp_user_id = 2 
     AND (agp_keywords NOT LIKE "%keyword1%" OR agp_keywords NOT LIKE "%key1%") 
     AND agp_keywords_date BETWEEN 1369872000 AND 1370044800 
GROUP BY agp_blog_id 

不过,我想,因为在所有一个记录已经匹配的条件排除结果“4”。

一些帮助将不胜感激。

+0

你想要的输出是什么? –

+0

它应该只返回6和3,因为所有“4”匹配的日期范围 –

+0

我不明白为什么4不应该检索,日期都是一样的。 “日期范围内的所有4场比赛”是什么意思? – Fabio

回答

0

我想这是你正在尝试做的:

SELECT agp_blog_id 
FROM wp_agp_settings_data 
WHERE 
     agp_user_id = 2 
     AND agp_blog_id NOT IN(
       SELECT agp_blog_id FROM wp_agp_settings_data WHERE agp_keywords LIKE "%keyword1%") 
     AND agp_keywords_date BETWEEN 1369872000 AND 1370044800 
GROUP BY agp_blog_id 

这将排除具有在agp_keywords列“关键字1”的任何结果。您可以添加额外的关键字排除在'NOT IN'块内

+0

谢谢大卫。这就是我一直在寻找的。我知道这是小调整。 –

0

您可以将NOT LIKE更改为LIKE,然后否定该OR块。

它去如下:

SELECT agp_blog_id, agp_keywords 
FROM wp_agp_settings_data 
WHERE 
     agp_user_id = 2 
     AND !(agp_keywords LIKE "keyword1%" OR agp_keywords LIKE "%testkey%") 
     AND agp_keywords_date BETWEEN 1369872000 AND 1370044800 
GROUP BY agp_blog_id; 

这里是一个SQLFiddle example