我需要什么加入?为什么我的查询不起作用?

时间:2015-06-11 12:08:10

标签: mysql sql

我无法弄清楚为什么我无法以我需要的格式获得结果:

我的数据库结构示例:

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的示例)我应该可以通过 title,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;

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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;