我试图编写一个获取所有基本食物数据的php函数。然后得到那种食物的成分。
因此,对于第一个查询,收到的每一行都有一个"食物ID"。
然后,我想把每个食物ID ...(这可能是我的问题所在)
然后从food_ing表中选择具有我提供的ID的成分。 (多个选择也可能存在问题)
它将为每种食物返回多种成分。这将是一个相当大的阵列。
所以,为了给我的设置提供更多上下文,我有3个表。 food,food_ratings,food_ing。
food_ing充满了各种成分,每一行都有计数,成分,然后是与之相关的food_id。那么我要问的是......查询和返回此信息的最佳方式是什么?
- 包含每种食物的数组,它的ID,描述,类型......
- 包含原始查询的所有食物的所有成分的阵列。 (我想我可以在收到数据后将它们分类到AS3一侧的各自食物)
我在想这样的事情。但它不起作用。我似乎无法让每一种食物都能在我的循环中工作,这就是构建我选择的成分循环的东西。我想这是因为我正在使用
如果有人可以在1次查询中解释如何执行此操作,那会是什么样的。
function getFoods($start, $limit) {
$qOne = mysql_query("SELECT a.id, a.name, a.type, AVG(b.r) AS fra, COUNT(b.id) as tvotes FROM `foods` a LEFT JOIN `foods_ratings` b ON a.id = b.id GROUP BY a.id ORDER BY fra DESC, tvotes DESC LIMIT $start, $limit;");
$arrOne = mysql_fetch_array($qOne);
$i = 0;
$qry = "";
foreach ($arrOne as $value) {
$fid = $value['id'];
if ($i > 0)
$qry .= " UNION ";
$i++;
$qry .= "SELECT fid, ing, amount FROM foods_ing WHERE fid='$fid'";
}
$qTwo = mysql_query($qry);
/*
if this helps anyone...I'm using amfphp to communicate with an AS3 project.
also returning $qOne works. so no issues there. The issue is just with $qTwo.
Unless the reccomendation is to somehow do this with 1 query.
*/
return array($qOne, $qTwo);
}
实际上我可能已经弄明白为什么它看起来很奇怪。似乎只有一排。我试过这个,但我仍然遇到麻烦。现在什么都没有被退回
编辑:我试过分享另一个循环。现在第一个结果不起作用......使用这个while循环会破坏我的结果或其他东西
但至少在这个循环中,它使查询正确,并返回正确的结果。(对于第二个数组)
function getFoods($sort, $start, $limit) {
$qOne = mysql_query("SELECT a.id, a.name, a.type, AVG(b.r) AS fra, COUNT(b.id) as tvotes FROM `foods` a LEFT JOIN `foods_ratings` b ON a.id = b.id GROUP BY a.id ORDER BY fra DESC, tvotes DESC LIMIT $start, $limit;");
$i = 0;
$qry = "";
while ($row = mysql_fetch_array($qOne)) {
$fid = $row['id'];
if ($i > 0)
$qry .= " UNION ";
$i++;
$qry .= "SELECT fid, ing, amount FROM foods_ing WHERE fid='$fid'";
}
$qTwo = mysql_query($qry);
return array($qOne, $qTwo);
}
编辑:
这是尝试用1个查询完成所有操作的另一次尝试。但它只是返回它获得的第一个值和数量(它应该是一个因为至少有一些成分而回来的数组
SELECT c.ing, c.amount, a.id, a.name, a.type, AVG(b.r) AS fra,
COUNT(b.id) as tvotes
FROM foods a
LEFT JOIN foods_ratings b ON a.id = b.id, foods_ing c
GROUP BY a.id
ORDER BY fra DESC, tvotes DESC
LIMIT $start, $limit
答案 0 :(得分:2)
您不能将mysql_query()用于多个语句。
如果您使用的是代码中的代码,那么您使用UNION的方式就会出错。您没有递增变量$i
。
要改善while循环并让$ qOne再次运行,您必须重置结果集指针$qOne
。
$i = 0;
$qry = "";
while ($row = mysql_fetch_array($qOne)) {
$fid = $row['id'];
if ($i > 0)
$qry .= " UNION ";
$i++;
$qry .= "SELECT fid, ing, amount FROM foods_ing WHERE fid='$fid'";
}
mysql_data_seek($qOne); // Reset the pointer $qOne
$qTwo = mysql_query($qry);
return array($qOne, $qTwo);
答案 1 :(得分:1)
你的sql必须使用“union”而不是“;”
...//your code
$i=0;
foreach ($row as &$value) {
$fid = $value['id'];
if($i <> 0)
$qry .=" UNION ";
$qry = $qry . "(SELECT ing, amount FROM foods_ing WHERE fid='$fid') ";
}
...//continue with your code
答案 2 :(得分:0)
使用Joins将多个表连接在一起。
答案 3 :(得分:0)
也许您可以返回$row
并稍后使用它们而不是查询?
function getFood($start, $limit) {
$one = mysql_query("SELECT a.id, a.name, a.type, AVG(b.r) AS fra, COUNT(b.id) as tvotes FROM `foods` a LEFT JOIN `foods_ratings` b ON a.id = b.id GROUP BY a.id ORDER BY fra DESC, tvotes DESC LIMIT $start, $limit;");
$row_one = mysql_fetch_array($one);
$qry = "";
foreach ($row_one as &$value) {
$fid = $value['id'];
$qry = $qry . "SELECT ing, amount FROM foods_ing WHERE fid='$fid';";
}
$two = mysql_query($qry);
$row_two = mysql_fetch_array($two);
return array ($row_one, $row_two);
}
答案 4 :(得分:0)
好的......
解决方案是使用while循环
while ($row = mysql_fetch_array($qOne)) {
$fid = $row['id'];
if ($i > 0)
$qry .= " UNION ";
$i++;
$qry .= "SELECT fid, ing, amount FROM foods_ing WHERE fid='$fid'";
}
感谢大家的投入,但我发现了自己的while循环。我会发布答案,以帮助任何可能需要它的人。
向那些使用UNION结合查询的建议提供支持。