我有一个有趣的错误,并有兴趣看到可能的解决方案。情况如下: 我有一个用户表(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来告诉数据库要跳过多少条记录。我现在需要计算很多地址。似乎不是一种优雅的方式,因为代码需要了解数据库的布局方式。
有什么想法吗?
答案 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;