Как сделать множественный выбор, используя данные из предыдущего запроса?

Я пытаюсь написать функцию php, которая получает все основные данные о еде. Тогда возьмите ингредиенты для этой еды.

Итак, для первого запроса у каждой полученной строки есть "идентификатор еды".

Затем я хочу взять каждый идентификатор еды... (это может быть, где моя проблема)

Затем выберите ингредиенты из таблицы food_ing, у которых есть идентификаторы, которые я предоставляю. (также может быть проблема с несколькими вариантами выбора)

Он будет возвращать несколько ингредиентов для каждой еды. Это будет довольно большой массив.

Итак, чтобы дать больше контекста моей настройке, у меня есть 3 таблицы. еда, еда, еда, еда.

food_ing полон ингредиентов, в каждой строке есть счетчик, ингредиент, а затем food_id, с которым он связан.

Так что я спрашиваю... что было бы лучшим способом запросить и вернуть эту информацию?

-Массив с каждой едой, это идентификатор, описание, тип...

-Массив со всеми ингредиентами для всех продуктов, первоначально запрашиваемых. (Я полагаю, что смогу отсортировать их по соответствующим продуктам на стороне AS3 после того, как получу данные обратно)

Я думал что-то вроде этого. Но это не работает. Кажется, я не могу заставить каждую еду работать в моем цикле, который строит мой цикл выбора ингредиентов. Я полагаю, это потому, что я использую

Что было бы замечательно, если бы кто-то мог объяснить, как сделать все это в одном запросе.

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);
}

На самом деле я мог бы понять, почему это выглядит странно. Кажется, что получал только 1 ряд. Я попробовал это, но у меня все еще проблемы. сейчас ничего не возвращается

РЕДАКТИРОВАТЬ: разделяя другой цикл, который я попробовал. Теперь первый результат не работает... Использование цикла 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);
        }

РЕДАКТИРОВАТЬ:

Вот еще одна попытка сделать все это с помощью одного запроса. Но он просто возвращает первые значения, которые он получает для ing ​​и amount (Это должен быть массив, который возвращается для ing, потому что есть хотя бы несколько ингредиентов

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 ответов

Решение

Итак....

Решение было с помощью цикла 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 для объединения запросов.

Вы не можете использовать 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);

Ваш sql должен использовать "union" not ";"

  ...//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

Используйте объединения для объединения нескольких таблиц.

Может быть, вы можете вернуть $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);
}
Другие вопросы по тегам