0

簡単な質問があります。データベースに次のテーブルがあります。

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_id のみを取得したいと考えています。これまでのところ、私はこれをしました:

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

ただし、1 つのレコードが既に条件に一致したため、結果 "4" はまったく除外したいと考えています。

いくつかの助けをいただければ幸いです。

4

2 に答える 2

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の例を次に示します。

于 2013-06-01T14:13:46.017 に答える
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 列に「keyword1」が含まれる結果が除外されます。「NOT IN」ブロック内で除外するキーワードを追加できます

于 2013-06-01T13:53:49.567 に答える