2015-06-11 36 views
0

我想不通为什么我不能在格式的结果,我需要:我需要什么加入?为什么我的查询不起作用?

我的数据库结构,例如:

CREATE DATABASE IF NOT EXISTS test_b DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci; 
USE test_b; 


CREATE TABLE authors(
    id BIGINT NOT NULL AUTO_INCREMENT, 
    name VARCHAR(100), 
    PRIMARY KEY (id) 
); 
CREATE TABLE galleries(
    id BIGINT NOT NULL AUTO_INCREMENT, 
    title VARCHAR(100), 
    author_id BIGINT NOT NULL, 
    published_at DATETIME, 
    PRIMARY KEY (id) 
); 
CREATE TABLE articles(
    id BIGINT NOT NULL AUTO_INCREMENT, 
    title VARCHAR(100), 
    author_id BIGINT NOT NULL, 
    published_at DATETIME, 
    PRIMARY KEY (id) 
); 

填充一些测试数据到数据库:

INSERT INTO authors (id, name) 
VALUES 
(1, 'Mike'), 
(2, 'John'), 
(3, 'Stan'); 

INSERT INTO galleries (id, title, author_id, published_at) 
VALUES 
(1, 'gallery title 1', 1, now()), 
(2, 'gallery title 2', 1, now()), 
(3, 'gallery title 3', 1, now()), 
(4, 'gallery title 4', 2, now()), 
(5, 'gallery title 5', 2, now()), 
(6, 'gallery title 6', 2, now()), 
(7, 'gallery title 7', 3, now()), 
(8, 'gallery title 8', 3, now()), 
(9, 'gallery title 9', 3, now()); 


INSERT INTO articles (id, title, author_id, published_at) 
VALUES 
(1, 'article title 1', 1, now()), 
(2, 'article title 2', 1, now()), 
(3, 'article title 3', 1, now()), 
(4, 'article title 4', 2, now()), 
(5, 'article title 5', 2, now()), 
(6, 'article title 6', 2, now()), 
(7, 'article title 7', 3, now()), 
(8, 'article title 8', 3, now()), 
(9, 'article title 9', 3, now()), 
(10, 'article title 10', 3, now()), 
(11, 'article title 11', 3, now()), 
(12, 'article title 12', 3, now()); 

我想要显示特定作者的所有已发布内容的表格(作者id = 2),并且我应该可以通过 标题,content_type和已发布的列进行排序:

title,   content_type,  published 
gallery title 4 gallery    DATETIME 
gallery title 5 gallery    DATETIME 
gallery title 6 gallery    DATETIME 
article title 4 article    DATETIME 
article title 5 article    DATETIME 
article title 6 article    DATETIME 

为什么我的查询不起作用?

SELECT 
a.id, 
a.name, 
CONCAT(IF(b.id IS NOT NULL,'gallery',''), IF(c.id IS NOT NULL,'article','')) as content_type, 
CONCAT(COALESCE(b.title, ''), COALESCE(c.title, '')) AS title 
FROM authors as a 
JOIN galleries AS b ON (a.id = b.author_id) 
JOIN articles AS c ON (a.id = c.author_id) 
WHERE a.id = 2; 

回答

3

我觉得你只是想union all

select title, 'gallery' as content_type, published_at 
from galleries 
where author_id = 2 
union all 
select title, 'article', published_at 
from articles 
where author_id = 2; 
+0

是工会不好的表现? – Dannyboy

+0

但我可以通过content_type或title排序吗? – Dannyboy

+0

'UNION'很糟糕,因为它删除了重复项。 'UNION ALL'只是结合了两个结果集,所以它通常表现更好。在这种情况下,'UNION ALL'应该几乎不会增加单独运行每个查询的开销。至于第二条评论:只需添加'按content_type排序'或'按标题排序'。 –

0
SELECT Distinct 
a.id, 
a.name, 
CONCAT(IF(b.id IS NOT NULL,'gallery',''), IF(c.id IS NOT NULL,'article','')), 
CONCAT(COALESCE(b.title, ''), COALESCE(c.title, '')) AS title 
FROM authors as a 
JOIN galleries AS b ON a.id = b.author_id 
JOIN articles AS c ON a.id = c.author_id 
where a.id = 2; 
+0

您查询的结果是这样的:http://pastie.org/10235408 – Dannyboy

相关问题