Как написать запрос mysql на выборку из таблицы строк на сумму не выше указанной?

Здравствуйте, помогите составить MysQL запрос
Есть таблица
id    price(цена)   effect(эффективность)
21	  10	              56
23	  70	              20
24	  20	              45
25	  30	              0
26	  50	              30

CREATE TABLE `table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `price` int(11) NOT NULL,
  `effect` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `table` (`id`, `price`, `effect`)
VALUES
	(1,10,56),
	(2,50,65),
	(3,35,20),
	(4,70,50),
	(5,10,0);

Нужно выбрать из таблицы строки с максимальной эффективностью на сумму не выше указанной (например, 100).
  • Вопрос задан
  • 2674 просмотра
Решения вопроса 1
@Fedot01
SELECT *, @sum := @sum + price FROM (SELECT *, @sum := 0 FROM `table` WHERE price <= 100 ORDER BY `effect` DESC) r WHERE  (@sum + price) <= 100
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
SELECT * FROM `table` ORDER BY `effect` DESC
...
$total = 0;
while ($row = $result->fetch_assoc()) {
  $tmp = $total + $row['price'];
  if($tmp < 100){
    $total += $row['price'];
  } else break;
}
...
Ответ написан
Можно попробовать использовать having sum(price) < 100 с сортировкой по эффективности, но вряд ли. Проще просто вернуть все данные, отсортировав по возрастанию и дальше в php написать функцию примерно такого вида:
function getRows($rows, $limit = 100) {
    $_effectCount = 0;
    $result = array();
    foreach ($rows as $row) {
        $_effectCount += $row['effect'];
        if ($_effectCount >= $limit) {
            break;
        }
        $result[] = $row;
    }
    return $result;
}
Ответ написан
kin9pin
@kin9pin
SELECT t.*,
       @sum := @sum + effect
FROM (
	SELECT *
	FROM `table`
	ORDER BY effect DESC
      ) AS t
      JOIN (SELECT @sum := 0) var
WHERE @sum < 100;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы