как найти наибольшее число из массива - PullRequest
0 голосов
/ 01 ноября 2009

Это таблица книг на БД;

book_ID             writer_ID
--------           -----------
1                      10
2                      10
3                      10
4                      10
5                      10

Это таблица ставок на БД,

book_ID    rate
-------   --------
1          4
2          3
2          5
2          1
2          4
3          5
4          2
4          5
4          2
4          4
5          3

Теперь у меня сначала есть writer_ID, и я должен найти все book_ID (связанные с этим writer_ID) и средние ставки каждого book_ID из таблицы ставок. наконец, я должен найти самый высокий средний показатель и его book_ID

это мой код

$query="SELECT * FROM books WHERE seller_id ='$id'";
$result = mysql_query($query);

while ($info = mysql_fetch_array($result)) {

//getaveragerate is the function that returns average of the rates from rates table
$arr = array(ID => $info['book_ID'], average => getaveragerate($info['book_ID']));

}


$greatest_average_and_books_id_number = max($arr); // dont know how to get highest average and its ID together from array

это мой вопрос, извините, но английский не мой родной язык, я изо всех сил стараюсь объяснить мою проблему. иногда я не могу, и я просто застрял.

спасибо за понимание.

Ответы [ 3 ]

10 голосов
/ 01 ноября 2009

Или просто позвольте базе данных сделать это за вас:

SELECT max(fieldname) FROM rates WHERE id='34'
2 голосов
/ 01 ноября 2009

Вы не сказали нам, какие поля из базы данных будут возвращены вашим запросом. Также похоже, что вы фильтруете (предложение WHERE) по ключевому столбцу, который должен возвращать только одну запись. Поэтому вы можете вычеркнуть все, что у вас есть, и положить только:

$greatest_record = 34;

Запрос вообще не нужен!

Немного больше информации о том, что вы делаете и какие поля вы ожидаете:

$query = "SELECT id, rate FROM rates";
$result = mysql_query($query);
$myarray = array();
$greatest_number = 0;
while ($row = mysql_fetch_array($result)) {
    myarray[] = $row; // Append the row returned into myarray
    if ($row['id'] > $greatest_number) $greatest_number= $row['id'];
}

// Print out all the id's and rates
foreach ($myarray as $row_num => $row) {
    print "Row: $row_num - ID: {$row['id']}, Rate: {$row['rate']} <br>";
} 

print "Highest ID: $greatest_number";

Обратите внимание, что мы сохранили наибольшее число в каждой строке, возвращаемой из базы данных, поэтому нам не пришлось снова циклически проходить через $ myarray. Незначительная оптимизация, которая может быть огромной оптимизацией, если у вас десятки тысяч строк и более.

Это решение основано на том, что вам необходимо использовать поля ID и RATE из базы данных позже, но вы хотите знать, какой сейчас самый большой идентификатор. Любой, не стесняйтесь редактировать мой ответ, если вы думаете, что есть лучший способ получить наибольший_номер из $ myarray после его генерации.


Обновление:

Тогда вам понадобится несколько запросов для выполнения вашей задачи.

Первый даст вам среднюю ставку за книгу:

SELECT 
    book_id,
    avg(rate) as average_rate
FROM Rates 
GROUP BY book_id

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

SELECT 
    max(averages.average_rate), 
    averages.book_id
FROM (
        SELECT 
            book_id,
            avg(rate) as average_rate
        FROM Rates 
        GROUP BY book_id
     ) 
     as averages
WHERE averages.average_rate = max(averages.average_rate)

Это даст вам список книг для данного автора:

SELECT book_id
FROM Books
WHERE writer_id = $some_id

Не пытайтесь делать все в одном запросе. Смешивание всех этих требований в одном запросе не будет работать так, как вы хотите, если только вы не возражаете против множества очень близких повторяющихся строк.

Я надеюсь, что вы можете использовать это обновление, чтобы ответить на ваш вопрос. Эти SQL-запросы дадут вам необходимую информацию, но вам все равно придется строить свои структуры данных в PHP, если вам нужно как-то использовать эти данные. Я уверен, что вы можете понять, как это сделать.

2 голосов
/ 01 ноября 2009

Если вы ограничены в отношении того, какие функции вы можете выполнять (например, с использованием некоторого класса CRUD):

SELECT * FROM rates WHERE id='34' ORDER BY id DESC LIMIT 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...