如何使用先前查询中的数据进行多项选择?

时间:2012-03-20 23:20:59

标签: php mysql amfphp

我试图编写一个获取所有基本食物数据的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

5 个答案:

答案 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结合查询的建议提供支持。