【问题标题】:MySQL SELECT only comments that belong to posts viewed on a specific page(pagination using LIMIT)MySQL SELECT 仅选择属于在特定页面上查看的帖子的评论(使用 LIMIT 分页)
【发布时间】:2017-08-09 23:51:56
【问题描述】:

好的,所以在尝试与 10 个后辈解决这个问题后,我不太确定如何解决它。

我有 1 个 MySQL 查询从数据库中提取所有 10 个 最新 帖子,并从帖子表中将它们显示在博客页面的第 0 页上。我使用 LIMIT 和偏移量,这样 PHP 每页只能显示 10 个帖子。 效果很好:

$sql = "
SELECT u.name
     , u.avatar
     , p.id
     , p.user_id
     , p.title
     , p.article
     , DATE_FORMAT(p.set_in,'%d/%m/%Y') date
     , DATE_FORMAT(p.last_edited,'%d/%m/%Y->%H:%i') edited
     , p.genre
     , p.band_image
     , p.albums 
  FROM posts p 
  JOIN users u 
    ON u.id = p.user_id 
 ORDER 
    BY p.set_in DESC
 LIMIT $offset, $rec_limit
";

现在我希望 MySQL 只选择属于我呈现的帖子的 cmets,而不是提取所有 cmets 并使用 PHP 将它们与帖子的相关 ID 进行匹配,但我似乎无法破解它由于某些原因。 基于可以删除帖子的事实,我不能使用 ID 范围的一些静态逻辑。

现在这是我的查询,但它非常糟糕,不适用于更大的网站:

$sql3 = "SELECT u.name,u.avatar,p.id,p.user_id,DATE_FORMAT(c.post_date,'%d/%m/%Y->%H:%i') date, c.ctitle, c.comment, c.id, c.user_id, c.post_id cid FROM comments c "
            . " JOIN users u ON u.id = c.user_id "
            . " JOIN posts p ON c.post_id = p.id "
            . " ORDER BY c.post_date DESC";

这是 cmets 表:

id  post_id user_id ctitle  comment post_date   
1   40  1   hinew   hinew   2017-08-08 00:41:10 
3   40  1   Another Comment test comment    2017-08-08 00:49:15 
4   45  20  How are you fine    2017-08-08 01:06:30 
5   1   1   aftersomefix    yeahhhh 2017-08-08 01:14:12 
6   1   26  dsfgdfg dfgdfg  2017-08-08 01:14:58 
7   45  1   TEST    TEST    2017-08-08 20:42:38

这是帖子表:

id  user_id title   article set_in      last_edited genre   band_image  albums  
1   1   Demo Text   This is the first post demo text    2017-08-05 18:40:55 2017-08-07 21:17:04 yoyo    2017.08.07.20.17.04-02aacec988bf439c277e2a2b611a23...   popo    
18  19  This is a test  test    2017-08-06 18:43:57 2017-08-07 21:18:11 another test    2017.08.07.20.18.11-177120fbd1a8951e2a70907f5600e5...   wow this is a test  
19  20  This is a 3ed   TEST    2017-08-06 18:49:10 2017-08-07 21:19:14 So many test moses  2017.08.07.20.19.14-17362774_10154643389487979_824...   yes i know we have many tests   
38  1   rtyrtyrty   asdasd  2017-08-07 15:19:57 2017-08-07 21:14:56 Metalcore   2017.08.07.20.14.56-17098309_963035173797767_82275...   aert
jhkghjk
aertaert    
39  1   Dude    Yes I think it does!    2017-08-07 19:54:21 2017-08-07 21:11:47 Is this actually working?   2017.08.07.19.00.53-81c0e26d68e0d29ceb619758e164da...   hi  
40  1   Test albums This is a decp  2017-08-07 20:16:26 2017-08-07 21:11:23 albums genre    2017.08.07.20.01.50-tenor.gif   one,two,tree,four,five,789789,lol   
41  1   BAND EX 1   DESC EX 1   2017-08-08 00:27:45 0000-00-00 00:00:00 GENRE EX 1  2017.08.07.23.27.45-19399240_10158895409495261_149...   EX 1    
42  1   Band ex2    Desc ex 2   2017-08-08 00:28:19 0000-00-00 00:00:00 Genre ex2   2017.08.07.23.28.19-13240136_1004564029622092_8185...   ex 2    
43  1   Name 3  Desc 3  2017-08-08 00:28:52 0000-00-00 00:00:00 Genre 3 2017.08.07.23.28.52-reptilian-death-the-dawn-of-co...   3   
44  1   Name 4  4   2017-08-08 00:29:15 0000-00-00 00:00:00 4   2017.08.07.23.29.15-Best Melodic Death Metal Cover...   4   
45  1   WHAT    hehe    2017-08-08 00:31:52 0000-00-00 00:00:00 MURDER  2017.08.07.23.31.52-Best Melodic Death Metal Cover...   cool

我试图制作一个对我不起作用的 WHERE IN,作为 SQL 菜鸟,我找不到任何包含分页因素的相关解决方案。

【问题讨论】:

  • 将您的第一个查询用作子查询并将其与 cmets 表连接。
  • 由于您在一个页面上显示它,我只会在两个单独的查询中加载帖子和 cmets,您应该有一个循环遍历所有帖子,以便您可以为每个帖子创建评论查询带有帖子 ID。
  • 我已经有一个循环,但我更感兴趣的是如何从 MySQL 中提取准确的数据,所以如果我有 10000 个 cmets,这不会永远持续下去。我会尝试@PaulSpiegel 的解决方案

标签: php mysql database pagination


【解决方案1】:

从您的第一个查询中删除除p.id 之外的所有内容,并将其用作子查询。然后将它与 cmets 表连接起来:

SELECT c.*, u.* -- select the columns you need
FROM comments c
JOIN users u ON u.id = c.user_id
JOIN (
    SELECT p.id -- other columns if needed in the outer query
    FROM posts p 
    ORDER BY p.set_in DESC
    LIMIT $offset, $rec_limit
) p ON p.id = c.post_id

【讨论】:

  • 所以我确实尝试过运行此查询,但字段列表中的帖子似乎不起作用。我尝试取消别名,但由于某种原因它仍然无法识别 posts.user_id 和 sometiems posts.id,这是我的查询:SELECT u.name,u.avatar,p.id,p.user_id,DATE_FORMAT(c .post_date,'%d/%m/%Y->%H:%i') cdate, c.ctitle, c.comment, c.id, c.user_id, c.post_id cid FROM cmets c JOIN users u ON u.id = c.user_id JOIN (SELECT posts.id FROM posts ORDER BY posts.set_in DESC LIMIT 1, 10) posts.id = c.post_id
  • 对不起,这是查询,上面的查询已关闭。选择 u.name , u.avatar , p.id , p.user_id , p.title , p.article , DATE_FORMAT(p.set_in,'%d/%m/%Y') 日期 , DATE_FORMAT(p.last_edited, '%d/%m/%Y->%H:%i') 已编辑,p.genre,p.band_image,p.albums,c.ctitle,c.comment,c.id,c.user_id,c。 post_id cid ,DATE_FORMAT(c.post_date,'%d/%m/%Y->%H:%i') cdate FROM cmets c JOIN users u ON u.id = c.user_id JOIN ( SELECT p.id FROM posts p ORDER BY p.set_in DESC LIMIT $offset, $rec_limit ) p ON p.id = c.post_id
  • @YardenSade 您需要来自posts 表的所有列,您还需要在子查询中进行选择。将SELECT p.id 替换为SELECT p.*。如果可行,请将p.* 替换为您需要的列。
猜你喜欢
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多