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

Я пытаюсь написать функцию 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);
        }

EDIT:

Вот еще одна попытка сделать все это одним запросом. Но он просто возвращает первые значения, которые он получает для 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 ]

2 голосов
/ 21 марта 2012

Вы не можете использовать 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 голос
/ 21 марта 2012

Ваш 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
0 голосов
/ 23 марта 2012

Хорошо, так ....

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

0 голосов
/ 21 марта 2012

Может быть, вы можете вернуть $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);
}
0 голосов
/ 21 марта 2012

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

...