符合结构和有序的MySQL查询

时间:2011-03-06 22:27:00

标签: php mysql sql mysqli

我在MySQL数据库中有一个表。

它的结构如下:

    CREATE TABLE `wall` (
       `wall_id` int(10) NOT NULL auto_increment,
       `user_id` int(10) NOT NULL,
       `wall_content` varchar(1024) NOT NULL,
       `time_posted` varchar(64) NOT NULL,
       `is_reply` int(10) NOT NULL,
       PRIMARY KEY  (`wall_id`)
    ) ENGINE=MyISAM

列'is_reply'将是'wall_id'的id,它是一个回复。我如何构建一个查询来获取基于另一个表的内部联接的所有行来交叉引用user_id,并在通过'time_posted'订购壁挂帖子时将墙上的评论与其下面的评论分组

我当前的查询没有对评论进行分组。它是:

SELECT wall.*, user_wall.*, users.username, users.avatar_id 
FROM `wall` 
INNER JOIN user_wall ON user_wall.wall_id = wall.wall_id 
INNER JOIN users ON users.user_id = wall.user_id 
WHERE user_wall.user_id=15

我希望你能理解这一点。

编辑: 表'user_wall'是一个表,用于存储用户墙上的值,'wall'表存储实际发布的内容。 'wall'表中的user_id是对发布该帖子的人的引用。

如上所述的当前查询功能齐全,并返回数据:

wall_id | user_id | wall_content | time_posted | is_reply | user_id | wall_id | username | avatar_id
    1   |    1    |  *content*   |  *time*     |   0      |    2    |    1    | User1    |     1
    2   |    1    |  *content2*  |  *time2*    |   0      |    2    |    2    | User1    |     1
    3   |    1    |  *content3*  |  *time3*    |   1      |    1    |    3    | User1    |     1

我的问题是,如何构造查询,结果如下:

wall_id | user_id | wall_content | time_posted | is_reply | user_id | wall_id | username | avatar_id
    1   |    1    |  *content*   |  *time*     |   0      |    2    |    1    | User1    |     1
    3   |    1    |  *content3*  |  *time3*    |   1      |    1    |    3    | User1    |     1
    2   |    1    |  *content2*  |  *time2*    |   0      |    2    |    2    | User1    |     1

其中'wall_id'3的行和'is_reply'为1的行位于带有'wall_id'的行的下方。类似地,'is_reply'为2的行将位于行的'wall_id'为2的行下。

2 个答案:

答案 0 :(得分:0)

SQL不能从一个表(例如wall_comments)返回多行,而只能从一个表中返回一行。换句话说,这是不可能做到的。有一种方法可以获得相同的结果,但使用两个SQL查询和一些PHP代码。

查询#1:

SELECT wall_comments.*
FROM `wall_comments`
INNER JOIN user_wall ON wall_comments.wall_id = user_wall.wall_id
WHERE user_wall.user_id=15

查询#2:

SELECT wall.*, user_wall.*, users.username, users.avatar_id
FROM `wall`
INNER JOIN user_wall ON user_wall.wall_id = wall.wall_id
INNER JOIN users ON users.user_id = wall.user_id
WHERE user_wall.user_id=15

PHP:

<?php
$result1 = mysql_query($query1);
$result2 = mysql_query($query2);

$comments = array();
while($row = mysql_fetch_assoc($result1))
{
  $comments[$row['wall_id']][] = $row;
}

$walls = array();
while($row = mysql_fetch_assoc($result2))
{
  $walls[] = array_merge(
               $row,
               array(
                 'comments' => isset($comments[$row['wall_id']]) ? $comments[$row['wall_id']] : array(),
                 ),
             );
}
?>

答案 1 :(得分:0)

既然你已经编辑了它,我明白你的意思。这应该这样做:

ORDER BY IF(wall.is_reply, wall.is_reply, wall.wall_id), wall.wall_id

格式:IF(EXPRESSION,IF_TRUE,IF_FALSE)