2015-06-11 81 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

相關問題