2012-09-22 166 views
1

我试图让所有的线程标记名称“测试”,例如,以及所有其他标记。如果我添加一个where子句到我的INNER JOIN选择,那么它将获得具有该标记的线程,但它不会获得该线程的其余标记(每个标记都是一个单独的行,我使用组concat来组合它们)。我怎样才能得到剩余的标签呢?选择所有包含标签和其他标签的主题?

我有以下SQL

SELECT `threads`.`id`, 
     `threads`.`title` AS `title`, 
     `threads`.`created_at` AS `created_at`, 
     `threads`.`views` AS `views`, 
     `threads`.`comments` AS `comments`, 
     `threads`.`user_id` AS `user_id`, 
     `tags` 
FROM `threads` 
INNER JOIN 
    (SELECT threads_id, 
      GROUP_CONCAT(DISTINCT `thread_tags`.`thread_tags_title`) AS tags 
    FROM `thread_tags` 
    WHERE `thread_tags`.`thread_tags_title` = 'test' 
    GROUP BY threads_id) thread_tags ON `threads`.`id` = `thread_tags`.`threads_id` 
WHERE `threads`.`status` = '1' 
ORDER BY `threads`.`views` DESC, `threads`.`created_at` DESC LIMIT 25 
OFFSET 0 

而下面的方案

标签

CREATE TABLE `tags` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `title` varchar(200) NOT NULL, 
    `status` int(11) NOT NULL, 
    `created_at` datetime NOT NULL, 
    `updated_at` datetime NOT NULL, 
    `description` varchar(255) DEFAULT NULL, 
    `doctors` int(11) DEFAULT NULL, 
    `threads` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1; 

的主题标签(表线程ID和标签ID)

CREATE TABLE `thread_tags` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `threads_id` int(11) NOT NULL, 
    `tag_id` int(11) NOT NULL, 
    `thread_tags_title` varchar(255) NOT NULL DEFAULT '', 
    `created_at` datetime NOT NULL, 
    `updated_at` datetime NOT NULL, 
    `description` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1; 

主题

CREATE TABLE `threads` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `user_id` int(11) NOT NULL, 
    `title` varchar(200) NOT NULL, 
    `body` text NOT NULL, 
    `status` int(11) NOT NULL, 
    `views` int(11) NOT NULL, 
    `rating` int(11) NOT NULL, 
    `comments` int(11) NOT NULL, 
    `created_at` datetime NOT NULL, 
    `updated_at` datetime NOT NULL, 
    `metadata` text, 
    PRIMARY KEY (`id`), 
    KEY `title` (`title`) 
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1; 
+0

添加where子句,有一吨的SELECT语句(它的工作,但它不是我想要的,也不是有效的),做了两只选择一个得到所有数组中的线程,然后是另一个在数组中选择的线程,但这也不是我想要的。如果可能,我想保留在单个查询中。 – Steven

回答

1

喜欢的东西

SELECT threads.*, GROUP_CONCAT(tags.title) 
FROM threads AS t 
LEFT JOIN thread_tags AS tt ON t.id = tt.threads_id 
LEFT JOIN tags AS tt ON tt.tag_id = tags.id 
WHERE t.id IN (
    SELECT tt.threads_id 
    FROM thread_tags AS tt 
    JOIN tags ON tt.tag_id = tags.id 
      AND tags.title = "test" 
) 
GROUP BY t.id