Php 简单关系数据库-高效查询

Php 简单关系数据库-高效查询,php,mysql,database,relational-database,Php,Mysql,Database,Relational Database,这基本上很简单,我只是说得太多了。我的数据结构如我文章底部所示。我的目标是以简单的电子表格格式组织数据,“扁平化”关系数据库。比如: Product1 URL Product2 URL URL URL Product3 URL 我的初步方法如下。我寻找替代方案的原因是我在products表中有>10000行,并且每个产品平均有5个URL。这会产生大量的MySQL查询(事实上超过了我的共享主机资源),一定有更好的方法,对吗?我的代码已经简化,可以提炼出问题的本质 我的方法 结果 明确地说,这是预

这基本上很简单,我只是说得太多了。我的数据结构如我文章底部所示。我的目标是以简单的电子表格格式组织数据,“扁平化”关系数据库。比如:

Product1 URL
Product2 URL URL URL
Product3 URL
我的初步方法如下。我寻找替代方案的原因是我在products表中有>10000行,并且每个产品平均有5个URL。这会产生大量的MySQL查询(事实上超过了我的共享主机资源),一定有更好的方法,对吗?我的代码已经简化,可以提炼出问题的本质

我的方法 结果 明确地说,这是预期的结果,输出是预期的。我只需要一种从原始数据库表到这个多维数组的更有效的方法。我怀疑有更有效的方法查询数据库。此外,我了解到,当扩展到所需大小时,此阵列会占用大量内存。我的目标是使用这个数组将数据导出到.CSV,如果效率更高,我会考虑使用XML(或某物)作为中介。因此,请随意提出完全不同的方法

//The result from   print_r($prods);

Array
(
    [0] => Array
        (
            [name] => Swarovski Bracelet
            [id] => 1
            [urls] => Array
                (
                    [0] => http://foo-example-url.com/index.php?id=7327

                )
        )
    [1] => Array
        (
           [name] => The Stranger - Albert Camus
           [id] => 2
           [urls] => Array
               (
                   [0] => http://bar-example-url.com/index.php?id=9827
                   [1] => http://foo-foo-example-url.com/index.php?id=2317
                   [2] => http://baz-example-url.com/index.php?id=5644
                )
        )
)
我的数据库模式 产品

id  product_name

1   Swarovski Bracelet
2   The Stranger - Albert Camus
3   Finnegans Wake - James Joyce
id  product_id  url                                                price

1   1           http://foo-example-url.com/index.php?id=7327       £16.95
2   2           http://bar-example-url.com/index.php?id=9827       £7.95
3   2           http://foo-foo-example-url.com/index.php?id=2317   £7.99
4   2           http://baz-example-url.com/index.php?id=5644       £6.00
5   3           http://bar-baz-example-url.com/index.php?id=9534   £11.50
URL

id  product_name

1   Swarovski Bracelet
2   The Stranger - Albert Camus
3   Finnegans Wake - James Joyce
id  product_id  url                                                price

1   1           http://foo-example-url.com/index.php?id=7327       £16.95
2   2           http://bar-example-url.com/index.php?id=9827       £7.95
3   2           http://foo-foo-example-url.com/index.php?id=2317   £7.99
4   2           http://baz-example-url.com/index.php?id=5644       £6.00
5   3           http://bar-baz-example-url.com/index.php?id=9534   £11.50
url.product\u id指向products.id的链接

如果你读过这篇文章,感谢你难以置信的耐心!我期待着阅读您的回复。那么我如何才能正确地做到这一点呢

 SELECT p.id, p.product_name, u.url 
 FROM products p, urls u 
 WHERE p.id = u.product_id ORDER BY p.id
PHP代码“展平”URL,我刚刚用空格分隔了URL

$i = 0;
$curr_id;
while($product  = mysql_fetch_array($products))
{
    $prods[$i]['name'] = $product['product_name'];
    $prods[$i]['id'] = $product['id'];

    if($product['id'] == $curr_id)
    {
        $prods[$i]['urls'] .= " ".$url['url'];  
    }
    else
    {
        $prods[$i]['urls'] = $url['url']; 
    }
    $i++;
    $curr_id = $product['id'];
}
结果

[0] => Array
        (
            [name] => Swarovski Bracelet
            [id] => 1
            [urls] => http://foo-example-url.com/index.php?id=7327
        )
  [1] => Array
        (
           [name] => The Stranger - Albert Camus
           [id] => 2
           [urls] => http://bar-example-url.com/index.php?id=9827 http://foo-foo-example-url.com/index.php?id=2317 http://baz-example-url.com/index.php?id=5644

        )
SQL

 SELECT p.id, p.product_name, u.url 
 FROM products p, urls u 
 WHERE p.id = u.product_id ORDER BY p.id
PHP代码“展平”URL,我刚刚用空格分隔了URL

$i = 0;
$curr_id;
while($product  = mysql_fetch_array($products))
{
    $prods[$i]['name'] = $product['product_name'];
    $prods[$i]['id'] = $product['id'];

    if($product['id'] == $curr_id)
    {
        $prods[$i]['urls'] .= " ".$url['url'];  
    }
    else
    {
        $prods[$i]['urls'] = $url['url']; 
    }
    $i++;
    $curr_id = $product['id'];
}
结果

[0] => Array
        (
            [name] => Swarovski Bracelet
            [id] => 1
            [urls] => http://foo-example-url.com/index.php?id=7327
        )
  [1] => Array
        (
           [name] => The Stranger - Albert Camus
           [id] => 2
           [urls] => http://bar-example-url.com/index.php?id=9827 http://foo-foo-example-url.com/index.php?id=2317 http://baz-example-url.com/index.php?id=5644

        )

即使您想收回URL的csv,您也可以通过一个查询收回准确的信息

SELECT 
    p.id, p.product_name, 
    GROUP_CONCAT(u.url) AS URLS 
    FROM products p LEFT JOIN urls u 
    ON p.id = u.product_id 
    GROUP BY p.id, p.product_name
然后对数据库进行一次查询,返回所需内容


或者更干净的方法是bruce建议的方法,然后让PHP将所有结果合并在一起。

您可以通过一个查询收回准确的信息,即使您想要收回URL的csv

SELECT 
    p.id, p.product_name, 
    GROUP_CONCAT(u.url) AS URLS 
    FROM products p LEFT JOIN urls u 
    ON p.id = u.product_id 
    GROUP BY p.id, p.product_name
然后对数据库进行一次查询,返回所需内容


或者更干净的方法是bruce建议的方法,然后让PHP将所有结果合并在一起。

您可以在一个查询中完成这一点:

select*from products-join-url-on-products.id=url.product\u-id-order-by-products.id

伪代码:

while(query_result) {
     if (oldpid == pid) { print ", \"url\"" }
     else { print "pid, \"url\"" }
     oldpid = pid;
}

您可以在一个查询中完成此操作:

select*from products-join-url-on-products.id=url.product\u-id-order-by-products.id

伪代码:

while(query_result) {
     if (oldpid == pid) { print ", \"url\"" }
     else { print "pid, \"url\"" }
     oldpid = pid;
}

您打算如何在CSV中表示两级层次结构?@Marcelo Cantos:OP告诉我们每个产品最多可以有五个URL;无论如何,他可以保存到csv
产品中;网址1;。。。;url n
当检索此文件时,会读取产品,然后每次读取一个url,直到行的末尾。最左边的列中的产品,右边的列中的url会根据需要的数量而增加。电子表格中会有空格。你的代码实际有效吗?您似乎没有增加$i和$n变量。。?还可以通过在SQL查询中指定字段名而不是使用SELECT*FROM…来提高代码的可读性。您的目标是什么?保存查询?如何加入?您计划如何在CSV中表示两级层次结构?@Marcelo Cantos:OP告诉我们每个产品最多可以有五个URL;无论如何,他可以保存到csv
产品中;网址1;。。。;url n
当检索此文件时,会读取产品,然后每次读取一个url,直到行的末尾。最左边的列中的产品,右边的列中的url会根据需要的数量而增加。电子表格中会有空格。你的代码实际有效吗?您似乎没有增加$i和$n变量。。?还可以通过在SQL查询中指定字段名而不是使用SELECT*FROM…来提高代码的可读性。您的目标是什么?保存查询?加入如何?这是完美的解决方案:+1!请注意,group_concat的默认最大长度为1024,在托管公司中,通常情况下,他们不允许您动态更改此服务器变量,也不授予您执行此操作的权限,因此这是一个完美的解决方案:+1!请注意,group_concat的默认最大长度为1024,在托管公司中,通常情况下,他们不允许您动态更改此服务器变量,或者根本不授予您进行全面回答的权限,最重要的是,这对我很有用!非常感谢。非常全面的答案,最重要的是,对我有用!谢谢。