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


Simple Relational Database - Efficient Querying

这实际上非常简单,我只是有点啰嗦。我的数据结构显示在我的帖子底部。我的目标是以简单的电子表格格式组织数据,使关系数据库"扁平化"。比如:

Product1 URL
Product2 URL URL URL
Product3 URL

我最初的方法如下。我正在寻找替代方案的原因是我在产品表中有> 10,000行,每个产品平均有5个url。这会产生大量的MySQL查询(实际上超过了我的共享主机资源),一定有更好的方法,对吗?我的代码已被简化,以提炼出我的问题的本质。

<标题> 我的方法
//Query to get all products
$products = mysql_query("SELECT * FROM products");
$i = 0;
//Iterate through all products
while($product  = mysql_fetch_array($products)){
    $prods[$i]['name'] = $product['name'];
    $prods[$i]['id'] = $product['id'];
    //Query to get all URLs associated with this particular product
    $getUrls = mysql_query("SELECT * FROM urls WHERE product_id =".$product['id']);
    $n = 0;
    while($url = mysql_fetch_array($getUrls)){
        $prods[$i]['urls'][$n] = $url['url'];  
    }
}
<标题>

要清楚,这是预期的结果,输出是预期的。我只需要一种更有效的方法从原始数据库表到多维数组。我怀疑还有更有效的查询数据库的方法。此外,我理解这个数组在扩展到所需的大小时使用大量内存。由于我的目标是使用此数组将数据导出到。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
                )
        )
)

My Database Schema

产品

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_id链接到products.id

如果你读了这篇文章,感谢你的耐心!我期待看到你的回复。那么我该怎么做呢?

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将所有结果合并在一起。

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

select * from products join urls on products.id = urls.product_id order by products.id

伪代码:

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