2011-07-24 114 views
1

我正在写与PHP/MySQL的如何结合这种情况下的sql select查询?

聊天软件,我有3个表:user, roomroom_participant与这些结构:

user: id, username 
room: id, title 
room_participant: room_id, user_id 

现在我想与所有的名单相处的所有房间列表每个房间的参与者。

到现在为止我只选择从室的桌子上所有的房间,并通过所有客房迭代,并选择用户信息从每个条目,这是非常低效的。

有没有办法将所有这些选择合并到只有1个选择查询?

回答

2

不能确定这个未经测试,但不妨一试:

SELECT 
    room.*, 
    user.* 
FROM room 
    JOIN room_participant ON room_id = room_participant.id 
    JOIN user ON room_participant.user_id = user.id 
ORDER BY room.id 

进行重复数据删除的房间,使用GROUP_CONCAT()

UPDATEGROUP_CONCAT()修改返回id|username

SELECT 
    room.id, room.name 
    GROUP_CONCAT(CONCAT(user.id,'|',user.username)) AS userlist 
FROM room 
    JOIN room_participant ON room_id = room_participant.id 
    JOIN user ON room_participant.user_id = user.id 
GROUP BY room.id, room.name 
ORDER BY room.id 

随着由生成的为id|name,id|name,id|name,您可以使用PHP explode()将它们分开。

// Split the list on the commas 
$users = explode(",", $userlist); 


$final_users = array(); 
// Then split each on the `|` 
foreach ($users as $user) { 
    $split_user = explode("|", $user); 

    // Append each as a new associative array to $final_users 
    $final_users[] = array('id' => $split_user[0], 'username' => $split_user[1]); 
} 

// Now you have an array of users as id, username 
var_dump($final_users); 
+0

你的第二个加入了一个错字:'ON room_participant.user_id' – Jacob

+0

@cularis感谢,固定。 –

+0

您好,感谢您的回答,它的工作原理,但该查询返回与相同ROOM_ID多个记录时,有超过2名人参加在那个房间里。我可以将记录中的用户条目分组吗(类似于房间记录字段中的用户数组)? – Peacemoon

0

您可能希望做两个查询,然后在任何使用MySQL的情况下进行匹配,例如, PHP。

这两个:

SELECT id, title 
    FROM room; 

SELECT rp.room_id, rp.user_id, u.username 
    FROM room_participant AS rp 
     INNER JOIN user as u ON rp.user_id = u.id; 

或这两种:

SELECT id, username 
    FROM user; 

SELECT rp.room_id, rp.user_id, r.title 
    FROM room_participant AS rp 
     INNER JOIN room as r ON rp.user_id = r.id; 

这两个查询意义取决于你与信息真的在做什么。

你可以走了一步,选择这三种分别:

SELECT * 
    FROM room; 

SELECT * 
    FROM user; 

SELECT * 
    FROM room_participant; 

注:它可能会更好陈述列,而不是在未来的新列使用“*”,以防万一加入到表中,您并不真正对这些查询感兴趣。

很显然,你接下来要一切投其所好中无论是使用MySQL,例如PHP。你可以创建房间和用户所选择的信息的列表,然后用类似方式对其进行匹配:

// Use MySQL to populate $roomList from database, then do... 
foreach ($roomList as $room) 
{ 
    $id = $room['id']; 
    $title = $room['title']; 

    $this->roomList[$id] = new Room($id, $title); 
} 

// Use MySQL to populate $userList from database, then do... 
foreach ($userList as $user) 
{ 
    $id  = $user['id']; 
    $username = $user['username']; 

    $this->userList[$id] = new User($id, $username); 
} 

// Use MySQL to populate $roomParticipantList from database, then do... 
foreach ($roomParticipantList as $roomParticipant) 
{ 
    $room = $this->roomList[$roomParticipant['room_id']]; 
    $user = $this->userList[$roomParticipant['user_id']]; 

    // You could do one/both of these, depending on requirements. 
    $room->enterUser($user); 
    $user->joinRoom($room); 
} 
+0

感谢您的详细解答。我认为只用1个查询就可以完成任何事情。 – Peacemoon