3

假设我有:

USERS:
userid | name
1      | John
2      | Jack

HITS:
id | userid | time
1  | 1      | 50
2  | 1      | 51
3  | 2      | 52
4  | 1      | 53
5  | 2      | 54
6  | 2      | 55

我需要最终得到这样的结构:

array() {
  [user 1] {
    hit 1 => 50
    hit 2 => 51
    hit 4 => 53
  }
  [user 2] {
    hit 3 => 52
    hit 5 => 54
    hit 6 => 55
  }
}

最糟糕的方法是:

  1. 选择 * 用户
  2. 为每个用户选择所有命中

有没有一种方法可以将结果作为一个查询而不需要像这样遍历每个查询?

4

4 回答 4

3

使用左外连接,从左表(主)中检索所有记录,并从右表中检索其他匹配。

select 
users.userid,  
h.time 
from  
users  
    left outer join hits h   
    on(  
      users.userid = h.userid
    )
于 2013-02-26T09:47:15.973 回答
0
SELECT * FROM users
LEFT JOIN hits on users.id = hits.user_id
于 2013-02-26T09:47:21.653 回答
0

是的,您可以JOIN为此使用 a 。

SELECT * FROM users
INNER JOIN hits on users.id = hits.user_id

您的结果将以平面数组的形式出现,但您可以轻松地循环并相应地格式化您的数组。

于 2013-02-26T09:42:19.003 回答
0

您需要的 sql 语句只是使用INNER JOIN或 LEFT JOIN 如果您想返回记录,即使某个用户在表命中时也没有匹配的记录

SELECT  a.*, b.time
FROM    users a
        INNER JOIN hits b
            ON a.userid = b.userid

查询的结果是一维数组,因此您需要在应用程序级别格式化结果。

要进一步了解有关联接的更多信息,请访问以下链接:

于 2013-02-26T09:42:34.980 回答