SQL查询错误 - 修复建议?

时间:2014-07-04 21:53:30

标签: javascript mysql sql

我有一个有趣的错误,并有兴趣看到可能的解决方案。情况如下: 我有一个用户表(user_id,first_name,last_name)。 我有一个地址表(user_id,地址)。 1个用户可以拥有多个地址。

我想要一组结果,例如: {'user':user_id,'address':address_array} //如果用户有多个地址,则将其分组。

我通过获取按user_id排序的所有内容完成此操作,然后遍历结果。

for (every item in results)
{
    if (current result.user_id equal to previous one)
    {
        append the address to previous user
    }
    else
    {
        add the new one to my return array
    }
}

这似乎工作正常,除了现在我想引入LIMIT。例如,我只想要前20个用户。当客户端按下NEXT时,它会跳过前20个并抓取接下来的20个记录。

问题是:

记录19:用户19具有地址1

记录20:用户19具有地址2

记录21:用户19具有地址3

记录22:用户19具有地址4

我现在的方式,第一批20只会显示用户19只有2个地址。然后,当客户端要求接下来的20个结果时,用户19将再次显示2个其他地址。

另外,我不能做array.length来告诉数据库要跳过多少条记录。我现在需要计算很多地址。似乎不是一种优雅的方式,因为代码需要了解数据库的布局方式。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

加入包含LIMIT的子查询:

SELECT userid, address
FROM (SELECT user_id
      FROM user
      ORDER BY user_id
      LIMIT 0, 20) AS u
JOIN address AS a ON u.user_id = a.userid

将第0替换为20,依此类推。

答案 1 :(得分:2)

我认为你需要group by group_concat()limit

SELECT u.user_id, GROUP_CONCAT(a.address) as addresses
FROM user u JOIN
     address a
     ON u.user_id = a.userid
GROUP BY u.user_id
ORDER BY u.user_id
LIMIT 0, 20;