只有在有评论的情况下,我的SQL才会产生结果
我有一个SQL查询,它可以把我所有的博客都从博客作者那里拉出来,并且它会对每个与评论作者相对应的博客评论都这样做 这3个表如下所示:只有在有评论的情况下,我的SQL才会产生结果,sql,innodb,Sql,Innodb,我有一个SQL查询,它可以把我所有的博客都从博客作者那里拉出来,并且它会对每个与评论作者相对应的博客评论都这样做 这3个表如下所示: CREATE TABLE `blogs` ( `uuid` int(255) NOT NULL, `title` varchar(1024) NOT NULL, `detail` varchar(1024) NOT NULL, `user_id` int(255) NOT NULL, `created` timestamp NOT NULL D
CREATE TABLE `blogs` (
`uuid` int(255) NOT NULL,
`title` varchar(1024) NOT NULL,
`detail` varchar(1024) NOT NULL,
`user_id` int(255) NOT NULL,
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `blogs`
ADD PRIMARY KEY (`uuid`),
ADD KEY `user_id` (`user_id`);
ALTER TABLE `blogs`
MODIFY `uuid` int(255) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
ALTER TABLE `blogs`
ADD CONSTRAINT `blogs_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users`
(`uuid`) ON DELETE NO ACTION ON UPDATE NO ACTION;
CREATE TABLE `blogs_comments` (
`uuid` int(255) NOT NULL,
`blog_uuid` int(255) NOT NULL,
`user_uuid` int(255) NOT NULL,
`comment` varchar(250) NOT NULL,
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `blogs_comments`
ADD PRIMARY KEY (`uuid`),
ADD KEY `user_uuid` (`user_uuid`),
ADD KEY `blog_uuid` (`blog_uuid`);
ALTER TABLE `blogs_comments`
MODIFY `uuid` int(255) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;
ALTER TABLE `blogs_comments`
ADD CONSTRAINT `blogs_comments_ibfk_1` FOREIGN KEY (`blog_uuid`)
REFERENCES `blogs` (`uuid`) ON DELETE NO ACTION ON UPDATE NO ACTION,
ADD CONSTRAINT `blogs_comments_ibfk_2` FOREIGN KEY (`user_uuid`)
REFERENCES `users` (`uuid`) ON DELETE NO ACTION ON UPDATE NO ACTION;
COMMIT;
CREATE TABLE `users` (
`uuid` int(255) NOT NULL,
`username` varchar(15) COLLATE utf8_unicode_ci NOT NULL,
`password` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
`foreName` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
`surName` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
`email` text COLLATE utf8_unicode_ci NOT NULL,
`number` int(11) NOT NULL,
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`is_admin` tinyint(1) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
ALTER TABLE `users`
ADD PRIMARY KEY (`uuid`);
ALTER TABLE `users`
MODIFY `uuid` int(255) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8;
SELECT
b.uuid AS 'Blog ID', b.title AS 'Blog Title',
b.detail AS 'Blog Body', u.uuid AS 'Blog Author ID',
u.username AS 'Blog Author Username',
(SELECT bc.comment WHERE u.uuid = bc.user_uuid) AS 'Comment',
(SELECT u.uuid WHERE u.uuid = bc.user_uuid) AS 'Comment Author ID',
(SELECT u.username WHERE u.uuid = bc.user_uuid) AS 'Comment Author Username'
FROM
blogs b
INNER JOIN
blogs_comments bc
ON
b.uuid = bc.blog_uuid
INNER JOIN
users u
ON
b.user_id = u.uuid
$stmt = (new PDO('dsn', 'user', 'pswd'))->Prepare($sql);
$stmt->execute([], PDO::FETCH_ASSOC);
var_export($stmt->fetchAll()); // Array holds nothing for blogs with no comments
我当前的查询如下所示:
CREATE TABLE `blogs` (
`uuid` int(255) NOT NULL,
`title` varchar(1024) NOT NULL,
`detail` varchar(1024) NOT NULL,
`user_id` int(255) NOT NULL,
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `blogs`
ADD PRIMARY KEY (`uuid`),
ADD KEY `user_id` (`user_id`);
ALTER TABLE `blogs`
MODIFY `uuid` int(255) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
ALTER TABLE `blogs`
ADD CONSTRAINT `blogs_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users`
(`uuid`) ON DELETE NO ACTION ON UPDATE NO ACTION;
CREATE TABLE `blogs_comments` (
`uuid` int(255) NOT NULL,
`blog_uuid` int(255) NOT NULL,
`user_uuid` int(255) NOT NULL,
`comment` varchar(250) NOT NULL,
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `blogs_comments`
ADD PRIMARY KEY (`uuid`),
ADD KEY `user_uuid` (`user_uuid`),
ADD KEY `blog_uuid` (`blog_uuid`);
ALTER TABLE `blogs_comments`
MODIFY `uuid` int(255) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;
ALTER TABLE `blogs_comments`
ADD CONSTRAINT `blogs_comments_ibfk_1` FOREIGN KEY (`blog_uuid`)
REFERENCES `blogs` (`uuid`) ON DELETE NO ACTION ON UPDATE NO ACTION,
ADD CONSTRAINT `blogs_comments_ibfk_2` FOREIGN KEY (`user_uuid`)
REFERENCES `users` (`uuid`) ON DELETE NO ACTION ON UPDATE NO ACTION;
COMMIT;
CREATE TABLE `users` (
`uuid` int(255) NOT NULL,
`username` varchar(15) COLLATE utf8_unicode_ci NOT NULL,
`password` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
`foreName` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
`surName` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
`email` text COLLATE utf8_unicode_ci NOT NULL,
`number` int(11) NOT NULL,
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`is_admin` tinyint(1) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
ALTER TABLE `users`
ADD PRIMARY KEY (`uuid`);
ALTER TABLE `users`
MODIFY `uuid` int(255) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8;
SELECT
b.uuid AS 'Blog ID', b.title AS 'Blog Title',
b.detail AS 'Blog Body', u.uuid AS 'Blog Author ID',
u.username AS 'Blog Author Username',
(SELECT bc.comment WHERE u.uuid = bc.user_uuid) AS 'Comment',
(SELECT u.uuid WHERE u.uuid = bc.user_uuid) AS 'Comment Author ID',
(SELECT u.username WHERE u.uuid = bc.user_uuid) AS 'Comment Author Username'
FROM
blogs b
INNER JOIN
blogs_comments bc
ON
b.uuid = bc.blog_uuid
INNER JOIN
users u
ON
b.user_id = u.uuid
$stmt = (new PDO('dsn', 'user', 'pswd'))->Prepare($sql);
$stmt->execute([], PDO::FETCH_ASSOC);
var_export($stmt->fetchAll()); // Array holds nothing for blogs with no comments
如果博客上有评论,这个查询可以正常工作。如果没有评论,博客将不会返回。有没有人知道我该如何改变这一点,这样即使没有评论,它也会带来博客
提前谢谢
更新:我的PDO如下所示:
CREATE TABLE `blogs` (
`uuid` int(255) NOT NULL,
`title` varchar(1024) NOT NULL,
`detail` varchar(1024) NOT NULL,
`user_id` int(255) NOT NULL,
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `blogs`
ADD PRIMARY KEY (`uuid`),
ADD KEY `user_id` (`user_id`);
ALTER TABLE `blogs`
MODIFY `uuid` int(255) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
ALTER TABLE `blogs`
ADD CONSTRAINT `blogs_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users`
(`uuid`) ON DELETE NO ACTION ON UPDATE NO ACTION;
CREATE TABLE `blogs_comments` (
`uuid` int(255) NOT NULL,
`blog_uuid` int(255) NOT NULL,
`user_uuid` int(255) NOT NULL,
`comment` varchar(250) NOT NULL,
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `blogs_comments`
ADD PRIMARY KEY (`uuid`),
ADD KEY `user_uuid` (`user_uuid`),
ADD KEY `blog_uuid` (`blog_uuid`);
ALTER TABLE `blogs_comments`
MODIFY `uuid` int(255) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;
ALTER TABLE `blogs_comments`
ADD CONSTRAINT `blogs_comments_ibfk_1` FOREIGN KEY (`blog_uuid`)
REFERENCES `blogs` (`uuid`) ON DELETE NO ACTION ON UPDATE NO ACTION,
ADD CONSTRAINT `blogs_comments_ibfk_2` FOREIGN KEY (`user_uuid`)
REFERENCES `users` (`uuid`) ON DELETE NO ACTION ON UPDATE NO ACTION;
COMMIT;
CREATE TABLE `users` (
`uuid` int(255) NOT NULL,
`username` varchar(15) COLLATE utf8_unicode_ci NOT NULL,
`password` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
`foreName` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
`surName` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
`email` text COLLATE utf8_unicode_ci NOT NULL,
`number` int(11) NOT NULL,
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`is_admin` tinyint(1) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
ALTER TABLE `users`
ADD PRIMARY KEY (`uuid`);
ALTER TABLE `users`
MODIFY `uuid` int(255) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8;
SELECT
b.uuid AS 'Blog ID', b.title AS 'Blog Title',
b.detail AS 'Blog Body', u.uuid AS 'Blog Author ID',
u.username AS 'Blog Author Username',
(SELECT bc.comment WHERE u.uuid = bc.user_uuid) AS 'Comment',
(SELECT u.uuid WHERE u.uuid = bc.user_uuid) AS 'Comment Author ID',
(SELECT u.username WHERE u.uuid = bc.user_uuid) AS 'Comment Author Username'
FROM
blogs b
INNER JOIN
blogs_comments bc
ON
b.uuid = bc.blog_uuid
INNER JOIN
users u
ON
b.user_id = u.uuid
$stmt = (new PDO('dsn', 'user', 'pswd'))->Prepare($sql);
$stmt->execute([], PDO::FETCH_ASSOC);
var_export($stmt->fetchAll()); // Array holds nothing for blogs with no comments
应该这样做。您需要一个
左连接
,从用户开始。然而,我认为您真正的困惑在于您需要加入用户两次:
SELECT b.uuid AS Blog_ID,
b.title AS Blog_Title,
b.detail AS Blog_Body,
u.uuid AS Blog_Author_ID,
u.username AS Blog_Author_Username,
bc.comment AS Comment,
bc.user_uuid AS Comment_Author_ID,
ubc.username AS Comment_Author_Username
FROM users u LEFT JOIN
blogs b
ON b.user_id = u.uuid LEFT JOIN
blogs_comments bc
ON b.uuid = bc.blog_uuid LEFT JOIN
users ubc
ON bc.user_uuid = u.uuid;
注:
- 不要对列别名使用单引号。仅对字符串和日期常量使用单引号
- 不要为列别名指定需要转义的名称。我用下划线替换了空格
- 如果您想同时获得博客用户和评论用户的姓名,那么您需要加入
users
两次
- 我不明白为什么在
SELECT
子句中使用子查询,而不使用FROM
子句
那太棒了!我真的很感激这些笔记,我所知道的一切都是自学的,所以这可能就是为什么我把它拿来做子查询的原因。谢谢没有索引?至少有一个
主键
。UUID将限制可伸缩性。另请参见提示:每个uuid
都是带有auto_increment@RickJames的主键。出于某种原因,我的SQL转储没有添加这一点。我还设置了外键,我越来越糊涂了。我没有看到自动增量。UUID和auto_increment是两种不同的动物。可能在CREATE TABLE
之后不久就是ALTER TABLE。。添加主键..
?@RickJames刚刚选中,有。很抱歉没有提供这个部分,我只是从SQL导出中复制了create table
部分,假设它涵盖了所有内容。噢,我想看看键。