2

SQLについて質問があります。

私は3つのテーブルを持っています:

  • 表 1 が呼び出されnews、主キーを持っていますID
  • 表 2 が呼び出されcategories、主キーもあるID
  • テーブル 3 が呼び出されnewscat、2 つの列がnewsあり、cat

私は現在、カテゴリ X に属さずに次の ID を見つけることができる単一の SQL クエリを探しています。

実際の例を挙げると:

  • 1 つのニュース ページと、次のニュース項目にジャンプするためのボタンがあります。
  • というグループもあるので、未公開ではないUnpublished次のグループを取得しようとしています。newsニュースは複数のカテゴリに分類できます。

    SELECT p.id 
    FROM posts p, post_cats pc 
    WHERE ???? 
    AND pc.post = p.id 
    AND p.id < '22' 
    ORDER BY p.id DESC LIMIT 1
    

誰でも何か考えがありますか?

これがうまくいくことを願っています(これを手で書いたばかりです):

CREATE TABLE IF NOT EXISTS `categories` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(200) CHARACTER SET latin1 NOT NULL,
  `special` varchar(100) CHARACTER SET latin1 NOT NULL COMMENT '[unpub]',
  PRIMARY KEY (`id`),
  KEY `name` (`name`,`special`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=8 ;

INSERT INTO `categories` (`id`, `name`, `special`) VALUES
(1, 'Category#1', ''),
(2, 'Category#2', ''),
(3, 'Category#3', ''),
(4, 'Unpublished', 'unpub');




CREATE TABLE IF NOT EXISTS `posts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(200) CHARACTER SET latin1 NOT NULL,
  `desc` text CHARACTER SET latin1 NOT NULL,
  PRIMARY KEY (`id`),
  KEY `title` (`title`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=4 ;

INSERT INTO `posts` (`id`, `title`, `desc`) VALUES
(1,'Title#1','Desc#1'),
(2,'Title#2','Desc#2'),
(3,'Title#3','Desc#3');



CREATE TABLE IF NOT EXISTS `post_cats` (
  `cat` int(11) NOT NULL,
  `post` int(11) NOT NULL,
  KEY `cat` (`cat`,`post`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

INSERT INTO `post_cats` (`cat`, `post`) VALUES
(1, 1),
(2, 1),
(3, 2),
(1, 2),
(2, 3),
(3, 3),
(4, 2);

したがって、News1 で [次へ] をクリックすると、News3が返されるはずです。これNewsは、2 がCategory「unpub」フラグが設定されているためです。

4

0 に答える 0