Как сделать множественный выбор, используя данные из предыдущего запроса?
Я пытаюсь написать функцию 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);
}