这基本上非常简单我只是对它很啰嗦。我的数据结构如我帖子底部所示。我的目标是以简单的电子表格格式组织数据,“扁平化”关系数据库。类似的东西:
Product1 URL
Product2 URL URL URL
Product3 URL
我的初步方法如下。我正在寻找替代方案的原因是我有> products表中有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
)
)
)
产品
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
URLs.product_id指向products.id的链接
如果你已经读过这篇文章,那就谢谢你的耐心!我期待着阅读你的回复。那我怎么能这样做呢?
答案 0 :(得分:3)
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代码,我刚刚用空格分隔了网址。
$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
)
答案 1 :(得分:2)
即使您想要撤回网址的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
然后你对数据库进行了1次查询,它会带回你需要的东西。
或者更简洁的方法是布鲁斯的建议,然后让PHP将所有结果合并在一起。
答案 2 :(得分:1)
您可以在一个查询中完成此操作:
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;
}