我有以下表格
-- Table `user`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `user` ;
CREATE TABLE IF NOT EXISTS `user` (
`uid` BIGINT NOT NULL AUTO_INCREMENT,
`username` VARCHAR(20) NULL,
`password` VARCHAR(250) NULL,
`name` VARCHAR(45) NULL
PRIMARY KEY (`uid`),
UNIQUE INDEX `username_UNIQUE` (`username` ASC))
ENGINE = InnoDB;
------------------------------------------
Table `post`
------------------------------------------
DROP TABLE IF EXISTS `post` ;
CREATE TABLE IF NOT EXISTS `post` (
`pid` BIGINT NOT NULL AUTO_INCREMENT,
`body` TEXT NULL,
`by_uid` BIGINT NOT NULL,
PRIMARY KEY (`pid`),
) ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `like_post`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `like_post` ;
CREATE TABLE IF NOT EXISTS `like_post` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`post_pid` BIGINT NOT NULL,
`liked_by` BIGINT NULL,
PRIMARY KEY (`id`)
)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `favourite_post`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `favourite_post` ;
CREATE TABLE IF NOT EXISTS `favourite_post` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`post_pid` BIGINT NOT NULL,
`favourite_by` BIGINT NULL,
PRIMARY KEY (`id`)
)
ENGINE = InnoDB;
表格数据 用户:
uid username password name
1 user1 pass1 User1 Name
2 user2 pass2 user2 name
发表:
Pid body by_uid
1 This my body text 1
2 This is my body text2 2
3 This is my body text 3 1
关于like_post的数据:
Id post_id liked_by
1 1 2 //post id=1 liked by user=2
2 1 1 //post id=1 like by user=1
关于Favourite_post的数据
Id post_id favourite_by
1 1 1 //post id=1 favourited by user=1
2 2 1 //post id=2 favourited by user=1
我试图使用单个字符串的sql进行查询,因为它在多个sql查询中做得很好。 我有一个帖子区域,我可以通过使用PDO执行来显示它 PHP代码显示帖子和喜欢的喜欢等
<?php
DBCon Class has the PDO Connection parameters
function selectQuery($str){
$c=new DBCon();
$con=$c->conN();
$stmt=$con->prepare($str);
$stmt->execute();
$row=$stmt->fetch();
return $row;
}
function selectQueries($str){
$c=new DBCon();
$con=$c->conN();
$stmt=$con->prepare($str);
$stmt->execute();
$rows=$stmt->fetchAll();
return $rows;
}
$strPosts=”SELECT * FROM post”;
$rows=selectQueries($strPosts);
foreach($rows as $row){
$pid=$row[‘pid’];
echo $row[‘body’];
$strLike=”SELECT * FROM like where post_pid=”.$pid.” LIMIT 1”;
$rowLike=selectQuery($strLike);
echo $rowLike[‘liked_by’];
$strFav=”SELECT * FROM favourite WHERE post_pid=”.$pid.” LIMIT 1”;
$rowFav=selectQuery($strFav);
echo $rowFav[‘favourite_by’];
}
?>
此代码工作正常,而我的帖子数量非常少,但如果帖子数量很大,这将使我的网页速度变慢。那么如何通过在SQL Query中使用单个代码来优化它,这样我就可以获得所有的帖子值,比如值和喜欢的值。
答案 0 :(得分:0)
解决方案不一定要使用单个查询(尽管这可能会使您作为开发人员的生活更轻松)。使其快速运行的方法是建立索引:您加入的列应具有索引。
以下是一个例子:
SELECT *
FROM User u
JOIN Post p ON p.by_uid=u.uid
这个简单的示例将获取所有用户及其相关帖子。
为了确保有效运行,您需要在Post.by_uid
上添加索引 - 这将允许服务器快速找到每个用户的相应帖子。如果没有索引,服务器将必须扫描Post
表中User
表中每行的每一行,以便检查&amp;查看该by_uid
行中的Post
值是否与当前User.uid
值匹配。