【问题标题】:SQL query bug - suggestions for fix?SQL 查询错误 - 修复建议?
【发布时间】:2014-07-04 21:53:30
【问题描述】:

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

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

我通过获取按 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 告诉数据库要跳过多少条记录。我需要计算现在有很多地址。这似乎不是一种优雅的方式,因为代码需要了解数据库的布局方式。

有什么想法吗?

【问题讨论】:

  • 信息不足。例如,您使用的是什么数据库?
  • 对不起,我用的是 MySQL

标签: javascript mysql sql


【解决方案1】:

加入包含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,依此类推。

【讨论】:

    【解决方案2】:

    我想你想要一个 group bygroup_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;
    

    【讨论】:

      猜你喜欢
      • 2012-12-15
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多