【问题标题】:Can this be done with a query (MySQL)?这可以通过查询(MySQL)来完成吗?
【发布时间】:2020-04-09 23:23:14
【问题描述】:

PHP 和 MySQL

这是一个设计和表格布局不佳的现有项目。已要求添加新的“功能”。

我想知道这样的查询是否可以放在一起(不是最好的查询)

快速总结:

已发布表单。

  • 它获取一个 messageid 和一个(空白)subid 的表

如果发布了新帖子..上述情况再次发生..

  • (messageid 和一个(空白)subid)

如果对现有帖子发表“评论”..

  • 它获取一个 messageid 和一个与它正在发表评论的“父”帖子/线程匹配的 subid 的表

不幸的是,这一切都在同一张桌子上.. 似乎在多桌子布局或其他东西中会更好?

但是:

  • 我知道父帖子(因为 subid col 是空的)
  • 我知道子帖子(因为 subid col 具有与父帖子相匹配的值是评论)
  • 所有帖子都有时间戳。

我如何获得查询,以及对以下内容进行分组/排序:

  • 选择 -parent posts- 没有 subid
  • 立即拥有所有 -child/comment 帖子- 在此下

并让它(最初?)按父 post_date 排序,然后是子/评论帖子(按他们的 post_dates 子排序)

这是一个示例表设置:

http://sqlfiddle.com/#!9/19dae/2/0

不确定此处是否需要简单的 GROUP BY?还是需要进行更高级的子选择?

顺序需要由父帖子'post_date''首先'完成。并且(以某种方式)在查询/数组返回中的'父'帖子之后让下一个子/评论帖子被注入。

这是我想要的结果顺序:

期望的结果:

'2020-03-30 09:48:50', 'Poster A', '49203-30032020094850000000', ''
'2020-03-30 09:50:50', 'Poster B', '49204-30032020095050000000', '49203-30032020094850000000'
'2020-04-03 09:55:50', 'Poster C', '49205-03042020095550000000', '49203-30032020094850000000'
'2020-03-31 09:48:50', 'Poster C', '49205-31032020094850000000', ''
'2020-04-03 09:40:50', 'Poster B', '49204-03042020094050000000', '49206-010432020094850000000'
'2020-04-01 09:48:50', 'Poster D', '49206-010432020094850000000', ''
'2020-04-02 09:49:50', 'Poster E', '49207-02042020094950000000', ''

更新:

地址:@Ngo Van Quan

为了他的回答。

这个:

select * from testtable
order by
(
 CASE testtable.subid WHEN 0 
 THEN testtable.messageid*1000 
 ELSE testtable.subid*1000 + testtable.messageid END
), 
testtable.messageid;

(我认为这是您打算提供的内容,而不是您发布的内容??)

**什么都不做

【问题讨论】:

    标签: php mysql sql-order-by


    【解决方案1】:

    此查询不会为您提供所需的确切信息,但会为每个帖子提供至少一行。如果没有 cmets,您将得到一行,其中包含一组 cmets 的 pf null 信息。如果有 cmets,您将在每条评论中获得一行,并重复父帖子信息:

    SELECT * 
    FROM testtable AS post 
    LEFT JOIN testtable as `comment` ON `comment`.subid = post.messageid
    WHERE post.subid = ''
    ORDER BY post.postdate ASC;
    

    【讨论】:

    • 但是可以在之前的父帖子上(和之后其他可能的顺序)cmet 之前发布另一个“父”帖子。
    • 我根据您的示例表更正了查询。这并不完全是你想要的,但我认为你不能得到像这样交错的东西。这至少会以合理的格式为您提供信息。
    【解决方案2】:

    这是执行任务的 sql:

    select * from table order by (CASE table.subid when 0 then table.id*1000 ELSE table.subid*1000+table.id END), table.id;

    【讨论】:

    • 什么是bustrip?这不编译。为什么单独的 " 双引号?还有语法错误?
    • 不-我已修复它并将其发布在上面原始帖子的底部...也在 SQLFiddle 上测试过...-不起作用-
    • 嗨@whispers 我明白为什么它不适合你的情况,message_id 和 subid 必须是整数才能保证计算
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 2023-03-21
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多