GVKun编程网logo

php – 每个论坛最新帖子的MySQL查询设计(php mysqli 查询)

6

如果您对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 查询)

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

谢谢

最佳答案
这是Stack Overflow上经常出现的令人尊敬的最大n组问题.这是给出表格的解决方案:

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:显示帖子和每个帖子的所有评论

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查询语句呢?下面就教您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查询-获取与帖子相关的最新评论

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个日期范围之间的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查询的相关知识,请在本站进行查询。

本文标签: