如果您对php–每个论坛最新帖子的MySQL查询设计和phpmysqli查询感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解php–每个论坛最新帖子的MySQL查询设计的各种细节,并对phpmy
如果您对php – 每个论坛最新帖子的MySQL查询设计和php mysqli 查询感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解php – 每个论坛最新帖子的MySQL查询设计的各种细节,并对php mysqli 查询进行深入的分析,此外还有关于mysql / php:显示帖子和每个帖子的所有评论、Mysql实例如何设计高效合理的MySQL查询语句、MYSQL查询-获取与帖子相关的最新评论、php – 3个日期范围之间的Mysql查询的实用技巧。
本文目录一览:- php – 每个论坛最新帖子的MySQL查询设计(php mysqli 查询)
- mysql / php:显示帖子和每个帖子的所有评论
- Mysql实例如何设计高效合理的MySQL查询语句
- MYSQL查询-获取与帖子相关的最新评论
- php – 3个日期范围之间的Mysql查询
php – 每个论坛最新帖子的MySQL查询设计(php mysqli 查询)
我有这3张桌子
forums_forum
+-----+--------+-------------+-------+-----+
| fid | name | description | index | cid |
+-----+--------+-------------+-------+-----+
| 36 | gdghdf | hjghj | 54 | 5 |
| 45 | yutuy | iuyi | 99 | 6 |
+-----+--------+-------------+-------+-----+
forums_threads
+----+-----+-----+-------+-------+------+-----------+------+
| id | tid | fid | moved | mfrom | view | important | lock |
+----+-----+-----+-------+-------+------+-----------+------+
| 1 | 4 | 36 | 0 | NULL | 0 | 0 | 0 |
| 2 | 12 | 36 | 0 | NULL | 7 | 0 | 0 |
| 3 | 9 | 15 | 0 | NULL | 0 | 0 | 0 |
+----+-----+-----+-------+-------+------+-----------+------+
forums_posts
+----+-------+--------+--------+---------------------+--------+--------+-----+
| id | title | detail | author | date | edited | editby | tid |
+----+-------+--------+--------+---------------------+--------+--------+-----+
| 1 | asfsd | sdfsd | 1 | 2010-07-01 21:31:29 | 0 | NULL | 4 |
+----+-------+--------+--------+---------------------+--------+--------+-----+
我正在尝试创建返回结果的查询 – >对于每个独特的’fid’,来自’forums_posts’的一行(ORDER BY’日期’).
forums_forum.fid = forums_threads.fid
forums_threads.tid = forums_posts.tid
谢谢
SELECT p.* FROM forums_posts p JOIN forums_threads t ON p.tid = t.tid
WHERE NOT EXISTS (
SELECT * FROM forums_posts p2 JOIN forums_threads t2 ON p2.tid = t2.tid
WHERE t.fid = t2.fid AND p.date < p2.date
);
mysql / php:显示帖子和每个帖子的所有评论
我知道这个问题被多次询问(但是,我仍然找不到解决方案):
> PHP MYSQL showing posts with comments
> mysql query – blog posts and comments with limit
> mysql structure for posts and comments
…
基本问题:拥有表格帖子,评论,用户……您可以使用一个选择语句选择并显示所有帖子和所有评论(使用comment.user,comment.text,comment.timestamp)吗?这样的选择语句怎么样?如果没有,最简单的解决方案是什么?
我还尝试使用posts表加入评论表并使用GROUP BY,但我在每行或每个评论中只有一个评论,但多次也是这些帖子!?
我尝试了第一个链接的解决方案(嵌套的MysqL_query然后获取)以及第二个链接(使用数组).然而,第一个引起了一堆错误(该帖子中的语法似乎不正确,我无法弄清楚如何解决它),在第二个我遇到了数组问题.
我的查询到目前为止看起来像这样:
SELECT p.id, p.title, p.text, u.username, c.country_name, (SELECT SUM(Vote_type) FROM Votes v WHERE v.post_id = p.id) AS sum_Vote_type FROM posts p LEFT JOIN user u ON ( p.user_id = u.id ) LEFT JOIN countries c ON ( c.country_id = u.country_id ) ORDER BY $orderby DESC
我想知道这个问题是不是很常见,有帖子和评论显示……?
感谢您提前的每一个帮助!
解决方法:
不知道你的数据库结构,它应该看起来像这样.请注意,您应该将*字符替换为您实际需要的更明确的列列表.
SELECT p.*, c.*, u.* FROM posts p
LEFT JOIN comments c ON c.post_id = p.id
LEFT JOIN users u ON u.id = p.author_id
请注意,如果您只是想获得计数,总和等等,那么缓存一些信息是个好主意.例如,您可能希望在post表中缓存注释计数,而不是在每个查询中对它们进行计数.仅在添加/删除评论时计算和更新评论计数.
编辑:
意识到您还想将用户数据附加到每个评论.你可以不止一次地加入同一个表,但它变得很难看.这可能会变成一个非常昂贵的查询.我还提供了一个如何对列进行别名的示例,以免混淆:
SELECT p.*, c.*, u.name as post_author, u2.name as comment_author FROM posts p
LEFT JOIN comments c ON c.post_id = p.id
LEFT JOIN users u ON u.id = p.author_id
LEFT JOIN users u2 ON u2.id = c.author_id
Mysql实例如何设计高效合理的MySQL查询语句
《MysqL实例如何设计高效合理的MySQL查询语句》要点:
本文介绍了MysqL实例如何设计高效合理的MySQL查询语句,希望对您有用。如果有疑问,可以联系我们。
MySQL查询语句大家都在用,但是应该如何设计高效合理的MySQL查询语句呢?下面就教您MySQL查询语句的合理设计办法,分享给大家学习学习.MysqL数据库
1.合理使用索引
索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率.现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构.索引的使用要恰到好处,其使用原则如下:MysqL数据库
●在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引.MysqL数据库
●在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引.MysqL数据库
●在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引.比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引.如果建立索引不但不会提高查询效率,反而会严重降低更新速度.MysqL数据库
●如果待排序的列有多个,可以在这些列上建立复合索引(compound index).MysqL数据库
●使用系统工具.如Informix数据库有一个tbcheck工具,可以在可疑的索引上进行检查.在一些数据库服务器上,索引可能失效或者因为频繁操作而使得读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用tbcheck工具检查索引的完整性,必要时进行修复.另外,当数据库表更新大量数据后,删除并重建索引可以提高查询速度.MysqL数据库
2.避免或简化排序MysqL数据库
应当简化或避免对大型表进行重复的排序.当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤.以下是一些影响因素:MysqL数据库
●索引中不包括一个或几个待排序的列;MysqL数据库
●group by或order by子句中列的次序与索引的次序不一样;MysqL数据库
●排序的列来自不同的表.MysqL数据库
为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表(尽管有时可能影响表的规范化,但相对于效率的提高是值得的).如果排序不可避免,那么应当试图简化它,如缩小排序的列的范围等.MysqL数据库
3.消除对大型表行数据的顺序存取MysqL数据库
在嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响.比如采用顺序存取策略,一个嵌套3层的查询,如果每层都查询1000行,那么这个查询就要查询10亿行数据.避免这种情况的主要办法就是对连接的列进行索引.例如,两个表:学生表(学号、姓名、年龄……)和选课表(学号、课程号、成绩).如果两个表要做连接,就要在“学号”这个连接字段上建立索引.MysqL数据库
还可以使用并集来避免顺序存取.尽管在所有的检查列上都有索引,但某些形式的where子句强迫优化器使用顺序存取.下面的查询将强迫对orders表执行顺序操作:MysqL数据库
SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008
虽然在customer_num和order_num上建有索引,但是在上面的语句中优化器还是使用顺序存取路径扫描整个表.因为这个语句要检索的是分离的行的集合,所以应该改为如下语句:MysqL数据库
SELECT * FROM orders WHERE customer_num=104 AND order_num>1001 UNION SELECT * FROM orders WHERE order_num=1008
这样就能利用索引路径处理查询.MysqL数据库
4.避免相关子查询MysqL数据库
一个列的标签同时在主查询和where子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次.查询嵌套层次越多,效率越低,因此应当尽量避免子查询.如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行.MysqL数据库
5.避免困难的正规表达式MysqL数据库
MATCHES和LIKE关键字支持通配符匹配,技术上叫正规表达式.但这种匹配特别耗费时间.例如:MysqL数据库
SELECT * FROM customer WHERE zipcode LIKE “98_ _ _”
即使在zipcode字段上建立了索引,在这种情况下也还是采用顺序扫描的方式.如果把语句改为SELECT * FROM customer WHERE zipcode >“98000”,在执行查询时就会利用索引来查询,显然会大大提高速度.MysqL数据库
另外,还要避免非开始的子串.例如语句:SELECT * FROM customer WHERE zipcode[2,3]>“80”,在where子句中采用了非开始子串,因而这个语句也不会使用索引.MysqL数据库
6.使用临时表加速查询MysqL数据库
把表的一个子集进行排序并创建临时表,有时能加速查询.它有助于避免多重排序操作,而且在其他方面还能简化优化器的工作.例如:MysqL数据库
SELECT cust.name,rcVBles.balance,……other columns FROM cust,rcvbles WHERE cust.customer_id = rcvlbes.customer_id AND rcvblls.balance>0 AND cust.postcode>“98000” ORDER BY cust.name
如果这个查询要被执行多次而不止一次,可以把所有未付款的客户找出来放在一个临时文件中,并按客户的名字进行排序:MysqL数据库
SELECT cust.name,rcvbles.balance,rcvbles WHERE cust.customer_id = rcvlbes.customer_id AND rcvblls.balance>0 ORDER BY cust.name INTO TEMP cust_with_balance
然后以下面的方式在临时表中查询:MysqL数据库
SELECT * FROM cust_with_balance WHERE postcode>“98000”
临时表中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘I/O,所以查询工作量可以得到大幅减少.MysqL数据库
注意:临时表创建后不会反映主表的修改.在主表中数据频繁修改的情况下,注意不要丢失数据.MysqL数据库
7.用排序来取代非顺序存取MysqL数据库
非顺序磁盘存取是最慢的操作,表现在磁盘存取臂的来回移动.sql语句暗藏了这一情况,使得我们在写应用程序时很容易写出要求存取大量非顺序页的查询.有些时候,用数据库的排序能力来替代非顺序的存取能改进查询.
MysqL数据库
以上就是教大家如何设计高效合理的MySQL查询语句的办法,希望对大家的学习有所帮助.MysqL数据库
《MysqL实例如何设计高效合理的MySQL查询语句》是否对您有启发,欢迎查看更多与《MysqL实例如何设计高效合理的MySQL查询语句》相关教程,学精学透。小编PHP学院为您提供精彩教程。
MYSQL查询-获取与帖子相关的最新评论
我正在尝试获取与我下载的每个帖子相关的最新1或2条评论,有点像instagram一样,因为它们显示每个帖子的最新3条评论,到目前为止,我正在获得帖子和喜欢的计数。
现在,我需要做的就是弄清楚如何获取最新评论,而不是太确定如何处理它,这就是为什么我希望拥有更多专业知识的人可以为我提供帮助!
这是我当前的查询:
(SELECT
P.uuid,P.caption,P.imageHeight,P.path,P.date,U.id,U.fullname,U.coverImage,U.bio,U.username,U.profileImage,coalesce(Activity.LikeCNT,0),Activity.CurrentUserLiked
FROM USERS AS U
INNER JOIN Posts AS P
ON P.id = U.id
LEFT JOIN (SELECT COUNT(DISTINCT Activity.uuidPost) LikeCNT,Activity.uuidPost,Activity.id,sum(CASE WHEN Activity.id = $id then 1 else 0 end) as CurrentUserLiked
FROM Activity Activity
WHERE type = 'like'
GROUP BY Activity.uuidPost) Activity
ON Activity.uuidPost = P.uuid
AND Activity.id = U.id
WHERE U.id = $id)
UNION
(SELECT
P.uuid,Activity.CurrentUserLiked
FROM Activity AS A
INNER JOIN USERS AS U
ON A.IdOtherUser=U.id
INNER JOIN Posts AS P
ON P.id = U.id
LEFT JOIN (SELECT COUNT(DISTINCT Activity.uuidPost) LikeCNT,sum(CASE WHEN Activity.id = $id then 1 else 0 end) as CurrentUserLiked
FROM Activity Activity
WHERE type = 'like'
GROUP BY Activity.uuidPost) Activity
ON Activity.uuidPost = P.uuid
AND Activity.id = U.id
WHERE A.id = $id)
ORDER BY date DESC
LIMIT 0,5
基本上,评论与点赞存储在同一表中。
所以表是Activity
,然后我有一列comment
存储注释文本,然后“类型”等于“注释”。
可能解释得不是很好,但我愿意尝试并提供尽可能多的细节!
如果有人可以帮助,将不胜感激!!
更新
在给出的此查询中,我目前收到此错误:
操作’=’的排序规则(utf8_general_ci,IMPLICIT)和(utf8_unicode_ci,IMPLICIT)的非法混合
SELECT Posts.id,Posts.uuid,Posts.caption,Posts.path,Posts.date,USERS.id,USERS.username,USERS.fullname,USERS.profileImage,coalesce(A.LikeCNT,com.comment
FROM Posts
INNER JOIN USERS
ON Posts.id = 145
AND USERS.id = 145
LEFT JOIN (SELECT COUNT(A.uuidPost) LikeCNT,A.UUIDPost
FROM Activity A
WHERE type = 'like'
GROUP BY A.UUIDPOST) A
on A.UUIDPost=Posts.uuid
LEFT JOIN (SELECT comment,UUIDPOST,@row_num := IF(@prev_value=UUIDPOST,@row_num+1,1) as row_number,@prev_value := UUIDPOST
FROM Activity
CROSS JOIN (SELECT @row_num := 1) x
CROSS JOIN (SELECT @prev_value := '') y
WHERE type = 'comment'
ORDER BY UUIDPOST,date DESC) Com
ON Com.UUIIDPOSt = Posts.UUID
AND row_number <= 2
ORDER BY date DESC
LIMIT 0,5
最新编辑
表结构:
帖子
----------------------------------------------------------
| id | int(11) | | not null |
| uuid | varchar(100) | utf8_unicode_ci | not null |
| imageLink | varchar(500) | utf8_unicode_ci | not null |
| date | timestamp | | not null |
----------------------------------------------------------
用户
-------------------------------------------------------------
| id | int(11) | | not null |
| username | varchar(100) | utf8_unicode_ci | not null |
| profileImage | varchar(500) | utf8_unicode_ci | not null |
| date | timestamp | | not null |
-------------------------------------------------------------
活动
----------------------------------------------------------
| id | int(11) | | not null |
| uuid | varchar(100) | utf8_unicode_ci | not null |
| uuidPost | varchar(100) | utf8_unicode_ci | not null |
| type | varchar(50) | utf8_unicode_ci | not null |
| commentText | varchar(500) | utf8_unicode_ci | not null |
| date | timestamp | | not null |
----------------------------------------------------------
这些是一些示例,在这种情况下,“活动”表中的“类型”将始终等于“注释”。
总结一切和欲望的结果:
当我查询用户帖子时,我希望能够进入“活动”表并为他的每个帖子获取 最新的
2条评论。也许没有评论,所以很明显它将返回0,或者该帖子可能有100条评论。但我只想获取最新/最近的2条评论。
一个例子可能是看Instagram如何做到这一点。对于每个帖子,显示最新的评论1、2或3 …
希望这可以帮助!
php – 3个日期范围之间的Mysql查询
我有一个允许用户生成报告的PHP脚本,他们可以选择3个日期范围.
即
2012-01-01 to 2012-01-31
AND
2011-01-01 to 2011-01-31
AND
2010-01-01 to 2010-01-31
但是当我执行查询,并且某个日期范围之间没有记录时,查询不返回任何值.
这是我的查询:
SELECT DealerName WHERE InterviewDate >= "2012/01/01 " AND InterviewDate <= " 2012/03/31"
AND InterviewDate >= "2012/07/01 " AND InterviewDate <= " 2012/09/31"
我需要一个查询,如果在1个日期范围内找到它,将返回数据,无论后续日期范围中是否没有数据.
数据汇总到一个表中,在该表中,相同的数据可能在多个日期.
例如:
dealerName 1 2012-01-01
dealerName 1 2012-02-31
dealerName 2 2012-03-01
dealerName 1 2012-06-01
dealerName 1 2012-06-31
因此,如果我想查询2012-01-01和2012-02-31和2012-06-01和2012-06-31之间的数据.我意识到1个日期范围可以包含所有这些范围,但用户可能希望在这两个日期范围之间排除数据.
解决方法:
面试日期不能介于x和y之间,且仍介于z和zz之间.你错过了一个OR – 另外,看看BETWEEN运算符
SELECT DealerName
FROM table
WHERE InterviewDate BETWEEN '2012-01-01' AND '2012-01-31'
OR InterviewDate BETWEEN '2011-01-01' AND '2011-01-31'
OR InterviewDate BETWEEN '2010-01-01' AND '2010-01-31'
编辑,对不起,错过了表名:)
今天的关于php – 每个论坛最新帖子的MySQL查询设计和php mysqli 查询的分享已经结束,谢谢您的关注,如果想了解更多关于mysql / php:显示帖子和每个帖子的所有评论、Mysql实例如何设计高效合理的MySQL查询语句、MYSQL查询-获取与帖子相关的最新评论、php – 3个日期范围之间的Mysql查询的相关知识,请在本站进行查询。
本文标签: