【问题标题】:3D array needed from SQL querySQL 查询所需的 3D 数组
【发布时间】:2016-06-27 11:57:51
【问题描述】:

我有一个网站,其中的图表由 SQL 查询返回的行填充:

SELECT * FROM datatable WHERE userId = $userId;

现在我的网站有一部分我希望在一个页面上显示许多图表。所以给定一个 userId 的列表,我需要在数据库中查询它们对应的行。

此响应将通过 JSON 发送回客户端并绘制。理想情况下,有一种方法可以从 mysql 取回某种形式的 3d 数组。这样我就不必手动解析行并将其分成数组数组。

即这是我不想要的:

SELECT * FROM datatable WHERE userId IN ($userIds);   

-------------------------
| userId  |  data...    |
-------------------------
|    1    |     11      |
|    1    |     12      |
|    1    |     13      |
|    2    |     21      |
|    2    |     22      |
-------------------------

因为这需要我在返回之前将所有 userId == ... 进一步处理到它们自己的数组中(这似乎很慢而且很糟糕)。

目前我只是为每个 userId 手动运行上述查询,将它们推送到一个数组,但我听说一般来说,1 个大查询比许多小查询快得多。

顺便说一句,我正在使用 Laravel 4.2 和 PHP 5.3,并且正在获取结果:

$stmt = $this->DB->prepare($sql);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

【问题讨论】:

  • 使用 FIND_IN_SET 代替 IN
  • 如果您使用的是 PDO,我希望您使用的是准备好的语句。看到查询中嵌入的变量永远不会令人鼓舞。
  • 没有。这就是这样做的方法。除非您在这里有 1+ n 个查询。你只需要一个! (加上关于准备好的语句的常见警告)。并且绝对不要使用 FIND_IN_SET。
  • 是的,我正在使用准备好的语句,这只是为 SO 简化的。 @Strawberry,您说“这就是这样做的方法”。您是指WHERE userId IN ($userIds) 并手动将这些行合并在一起吗?
  • 是的。你的查询没问题。但我认为你没有正确地准备你的陈述。

标签: php mysql sql multidimensional-array


【解决方案1】:

我找不到真正的解决方案。最终不得不在代码中进行分组。

附:我明白为什么 cmets 关心我准备好的语句,但在我的实际代码中它看起来像这样。

$userIDs = [1, 2, 3, 4, ...]

// $placeholder = "?,?,?,?"
$placeholder = create_placeholder($userIDs);
$sql = "SELECT * FROM table WHERE userID IN ($placeholder)";

$stmt = $this->db->prepare($sql);
$stmt->execute($userIDs);
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

欢迎就使用IN 子句准备语句的更好方法提出建议。但老实说,人们有点信仰。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2022-01-21
    • 2012-07-06
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多