【问题标题】:SQL group results as a column arraySQL 将结果分组为列数组
【发布时间】:2011-02-08 01:51:42
【问题描述】:

这是一个 SQL 问题,不知道要使用哪种类型的 JOIN、GROUP BY 等,它适用于聊天程序,其中消息与房间相关,房间中的每一天都与成绩单等相关联。

基本上,在输出我的成绩单时,我需要显示哪些用户在该成绩单上进行了聊天。目前我通过这样的消息链接它们:

SELECT rooms.id, rooms.name, niceDate, room_transcripts.date, long 
 FROM room_transcripts 
  JOIN rooms ON room_transcripts.room=rooms.id 
  JOIN transcript_users ON transcript_users.room=rooms.id AND transcript_users.date=room_transcripts.date 
  JOIN users ON transcript_users.user=users.id 
 WHERE room_transcripts.deleted=0 AND rooms.id IN (1,2) 
 ORDER BY room_transcripts.id DESC, long ASC

结果集如下所示:

Array
(
    [0] => Array
        (
            [id] => 2
            [name] => Room 2
            [niceDate] => Wednesday, April 14
            [date] => 2010-04-14
            [long] => Jerry Seinfeld
        )

    [1] => Array
        (
            [id] => 1
            [name] => Room 1
            [niceDate] => Wednesday, April 14
            [date] => 2010-04-14
            [long] => Jerry Seinfeld
        )

    [2] => Array
        (
            [id] => 1
            [name] => Room 1
            [niceDate] => Wednesday, April 14
            [date] => 2010-04-14
            [long] => Test Users
        )

)

我希望数组中的每个元素都表示一个脚本条目,并将用户分组到一个数组中作为条目的元素。所以'long'将是一个列出所有名字的数组。这个可以吗?

目前我只是附加名称,当成绩单日期和房间发生变化时,我会回溯它们,但我会对文件和突出显示的消息做同样的事情,这很混乱。

谢谢。

【问题讨论】:

  • 由于关系模型的结构,这个任务最好在查询后处理,在 PHP 中。

标签: sql sqlite pdo


【解决方案1】:

您的结果中不能有一个数组作为long 字段,因为每个数组元素代表表中的一行。但是您可以改为使用连接字符串,并在需要时拆分字符串。查询将如下所示:

SELECT rooms.id, rooms.name, niceDate, room_transcripts.date, group_concat(long) as long
 FROM room_transcripts
  JOIN rooms ON room_transcripts.room=rooms.id 
  JOIN transcript_users ON transcript_users.room=rooms.id AND transcript_users.date=room_transcripts.date 
  JOIN users ON transcript_users.user=users.id 
 WHERE room_transcripts.deleted=0 AND rooms.id IN (1,2)
 GROUP BY room_transcripts.id
 ORDER BY room_transcripts.id DESC

【讨论】:

    猜你喜欢
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    相关资源
    最近更新 更多