Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 获取大量ID的额外数据_Php_Mysql_Mysqli - Fatal编程技术网

Php 获取大量ID的额外数据

Php 获取大量ID的额外数据,php,mysql,mysqli,Php,Mysql,Mysqli,我有一个MySQL表,其中包含关于对象的信息。看起来是这样的: +--------------+----+--------+-------+ | auto_incr_id | id | type | value | +--------------+----+--------+-------+ | 1 | 1 | length | 105 | | 2 | 1 | weight | 17 | | 3 | 1 | p

我有一个MySQL表,其中包含关于对象的信息。看起来是这样的:

+--------------+----+--------+-------+
| auto_incr_id | id |  type  | value |
+--------------+----+--------+-------+
|            1 |  1 | length |   105 |
|            2 |  1 | weight |    17 |
|            3 |  1 | price  |   104 |
|            4 |  2 | length |   111 |
|            5 |  2 | weight |    18 |
|            6 |  2 | price  |    87 |
+--------------+----+--------+-------+
我要获取按长度排序的前x个对象:

{
    "id": 2,
    "length": 111,
    "weight": 18,
    "price": 87
},
{
    "id": 1,
    "length": 105,
    "weight": 17,
    "price": 104
}
以下是我为实现这一目标所做的: 首先,我获取ID:

$type = "length";
$stmt = $mysqli->prepare("SELECT id FROM table WHERE type=? ORDER BY value DESC LIMIT ?");
$stmt->bind_param('si', $type, $limit);
$stmt->execute();
$result = $stmt->get_result();
$result = $result->fetch_all(MYSQLI_ASSOC);
接下来,我将获取所获取的每个对象的其他值:

$i = 0;
while ($i < count($result)) {
    $stmt = $mysqli->prepare("SELECT type, value FROM table WHERE id=?");
    $stmt->bind_param('i', $result[$i]['id']);
    $stmt->execute();
    $result_2 = $stmt->get_result();
    $fetch = $result_2->fetch_all(MYSQLI_ASSOC);

    $j = 0;
    while ($j < count($fetch))
    {
        $result[$i][$fetch[$j]['type']] = $fetch[$j]['value'];
        $j++;
    }
}
$i=0;
而($iprepare(“从id=?”的表中选择类型和值”);
$stmt->bind_param('i',$result[$i]['id']);
$stmt->execute();
$result_2=$stmt->get_result();
$fetch=$result\u 2->fetch\u all(MYSQLI\u ASSOC);
$j=0;
而($j
这对于获取前5名(例如,
$limit=5
)非常有用,但现在我有了一个用例,我想获得前10k或更多的信息。这需要花费太多时间,可能是因为它需要通过while循环并为每个找到的ID执行一条语句


因此,我正在寻找一种方法来减少获取这些数据的执行时间。有什么想法吗?

至少你可以一直使用子查询

SELECT id, type, value FROM table 
WHERE id IN (SELECT id FROM table WHERE type=? ORDER BY value DESC LIMIT ?")
order by id

至少你可以使用子查询

SELECT id, type, value FROM table 
WHERE id IN (SELECT id FROM table WHERE type=? ORDER BY value DESC LIMIT ?")
order by id

您的问题似乎是对表联接缺乏了解。做这件事有正确的方法也有错误的方法。错误的方式很容易理解,所以我会展示它,这样它才有意义

select id, type, value from table where id in (select id from table where type='length');
显然,它从每个具有type='length'值的id中获取类型/值组合。但是,您并不是在数据库中完成所有操作。您仍然需要对数据库之外的所有内容进行排序和分组。假设您只有type='length','weight'和'price'。我可以动态创建三个表,创建长度、重量和价格属性

select l.id, length, weight, price from
(select id, value as length from table where type='length') l
left outer join
(select id, value as weight from table where type='weight') w
on l.id=w.id
left outer join
(select id, value as price from table where type='price') p
on l.id=p.id
order by length
现在,您将获得一行中的每个属性,每个id一行。这里不保证id字段是唯一的。如果同一ID具有多个长度,则它将在结果中显示多次。但是,我希望您能看到我是如何将明显的子查询转化为连接来完成数据库中的所有工作的


注意:我修复了歧义错误,并添加了“left-outer”以包括不存在权重和价格的行。

您的问题似乎是对表联接缺乏了解。做这件事有正确的方法也有错误的方法。错误的方式很容易理解,所以我会展示它,这样它才有意义

select id, type, value from table where id in (select id from table where type='length');
显然,它从每个具有type='length'值的id中获取类型/值组合。但是,您并不是在数据库中完成所有操作。您仍然需要对数据库之外的所有内容进行排序和分组。假设您只有type='length','weight'和'price'。我可以动态创建三个表,创建长度、重量和价格属性

select l.id, length, weight, price from
(select id, value as length from table where type='length') l
left outer join
(select id, value as weight from table where type='weight') w
on l.id=w.id
left outer join
(select id, value as price from table where type='price') p
on l.id=p.id
order by length
现在,您将获得一行中的每个属性,每个id一行。这里不保证id字段是唯一的。如果同一ID具有多个长度,则它将在结果中显示多次。但是,我希望您能看到我是如何将明显的子查询转化为连接来完成数据库中的所有工作的



注意:我修复了歧义错误,并添加了“left-outer”以包括不存在权重和价格的行。

在数据库中执行此操作。加入你的两个问题。@kainaw这没那么容易。EAV总是一个棘手的问题with@kainaw我不知道那会怎样。。。你能详细说明一下或者举个例子吗?@你的常识是谁会建议一个不同的数据库设置呢?我选择此设置是因为不清楚将监视多少类型,并且并非所有对象都将监视相同的类型。@YourCommonSense EAV(开玩笑的论坛)可能有什么问题。。。。。Topicstarter理想情况下,您需要使用现有的EAV表模型来识别通用对象属性并为其创建表。。我还必须处理这个问题,我构建了一个EAV staging表和程序,并从中导出可用的表,以便在主程序中使用。。添加属性后,您需要重新运行重建脚本,并更改主程序,以及在数据库中执行此操作。加入你的两个问题。@kainaw这没那么容易。EAV总是一个棘手的问题with@kainaw我不知道那会怎样。。。你能详细说明一下或者举个例子吗?@你的常识是谁会建议一个不同的数据库设置呢?我选择此设置是因为不清楚将监视多少类型,并且并非所有对象都将监视相同的类型。@YourCommonSense EAV(开玩笑的论坛)可能有什么问题。。。。。Topicstarter理想情况下,您需要使用现有的EAV表模型来识别通用对象属性并为其创建表。。我还必须处理这个问题,我构建了一个EAV staging表和程序,并从中导出可用的表,以便在主程序中使用。。添加属性后,您需要重新运行重建脚本并更改主程序。如果类型的值列值不唯一,我怀疑这是否正常工作,因为此
排序,那么对于
|1 |长度| 105 |
|2 |长度| 105 |
您来说,这将是不确定的无法预测这两条记录中的哪一条是“第一条”或“最后一条”。。公平地说,topicstarter没有提到关于重复数据的注释,就像我说的,两个不同的ID确实可能具有相同的长度。但是,不可能同一个ID有两个长度值。好的@Binocopars,那么这个查询可以正常工作,
ORDER BY
将被认为是确定的,因为这些值总是唯一的。@RaymondNijland,所以不需要像您前面提到的那样自动递增列吗?因为我有一条,为了简单起见,我没有提到它。不,你不必添加它,然后我删除了@Binocopars的注释我误读了你的第一条注释。如果类型的值列值不是唯一的,我怀疑这会正确工作,因为这是
ORDE