Выберите запрос, возвращающий 1 результат вместо 3 из-за AVG

Приведенный ниже запрос на выборку возвращает 1 строку, когда она должна быть 3. Я уверен, что это из-за поля AVG (k.sumtotal).

Если я переписываю запрос, вынимаю этот столбец AVG (k.sumtotal) и извлекаю FROM inv_ratings AS k, я получаю 3 строки.

Я не могу понять, почему эта таблица (inv_ratings) или этот столбец AVG (k.sumtotal) ограничивают количество строк до 1. Я часами смотрел в Интернете, пытаясь найти информацию о возврате результатов с помощью предложения AVG, и не нашел много. Должен ли я использовать предложение group by, я пробовал это и получал только ошибки.

$p = "SELECT i.invention_id, i.inv_title, i.date_submitted, i.category_id,". " i.approved, c.category_id, c.category, u.image_name, AVG(k.sumtotal)". " FROM inv_ratings AS k INNER JOIN inventions AS i USING (invention_id)". " INNER JOIN categories AS c USING (category_id)". " INNER JOIN images AS u USING (invention_id)". " WHERE c.category_id = $cat AND i.approved = 'approved'". " HAVING u.image_name < 2". " ORDER BY date_submitted". " DESC LIMIT $start, $display";

$q = mysqli_query($dbc, $p) or trigger_error("Query: $p\n<br />mysqli Error: " . mysqli_error($dbc));

1

Решение

Вы сталкиваетесь с одной из проблем MySQL:

http://dev.mysql.com/doc/refman/5.5/en/group-by-handling.html

Я ненавижу, что MySQL когда-либо разрешает этот синтаксис, потому что это только вызывает путаницу. Но то, что вы, вероятно, хотите (чтобы использовать хакерское поведение MySQL, обратите внимание, что, если для какого-либо из полей, кроме изобретение_ид или суммы, есть несколько значений, вы получаете случайное значение из этого столбца):

$p = "SELECT i.invention_id, i.inv_title, i.date_submitted, i.category_id,". " i.approved, c.category_id, c.category, u.image_name, AVG(k.sumtotal)". " FROM inv_ratings AS k INNER JOIN inventions AS i USING (invention_id)". " INNER JOIN categories AS c USING (category_id)". " INNER JOIN images AS u USING (invention_id)". " WHERE c.category_id = $cat AND i.approved = 'approved'". " GROUP BY i.invention_id ". " HAVING u.image_name < 2". " ORDER BY date_submitted". " DESC LIMIT $start, $display";

Или, чтобы не использовать хакерское поведение MySQL:

$p = "SELECT i.invention_id, i.inv_title, i.date_submitted, i.category_id,". " i.approved, c.category_id, c.category, u.image_name, AVG(k.sumtotal)". " FROM inv_ratings AS k INNER JOIN inventions AS i USING (invention_id)". " INNER JOIN categories AS c USING (category_id)". " INNER JOIN images AS u USING (invention_id)". " WHERE c.category_id = $cat AND i.approved = 'approved'". " GROUP BY i.invention_id, i.inv_title, i.date_submitted, i.category_id,". " i.approved, c.category_id, c.category, u.image_name ". " HAVING u.image_name < 2". " ORDER BY date_submitted". " DESC LIMIT $start, $display";
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]