【发布时间】: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