2012-05-23 4 views
1

Это задача: у меня есть таблица db с именем «reports», один из столбцов в этой таблице - «submitted_by». В этом столбце указано имя пользователя, отправившего отчет.Объедините эти два MySQL-запроса в один

Теперь мне нужно отобразить список имен пользователей, упорядоченных по количеству опубликованных отчетов. Так что-то вроде этого должно получиться:

User | Доклады


Mark | 25


John | 18


Mary | 7

т.д.

Я написал этот PHP/MySQL код, чтобы сделать это, это довольно просто, но мне было интересно, если они могут быть объединены в 1 запрос. Кроме того, это принесет большую пользу с точки зрения эффективности?

$users=array(); 

$result=mysql_query("select id,submitted_by from reports group by submitted_by"); 
while($row=mysql_fetch_array($result)){ 
    $result1=mysql_query("select id,submitted_by from reports where submitted_by='$row[submitted_by]' "); 
    $users[$row[submitted_by]]=mysql_num_rows($result1); 
} 

arsort($users); 

А потом просто эхо каждый элемент из $users.

+2

Вам не нужно два запроса, просто добавьте 'COUNT (*) AS«number_of_reports'' к вашему SELECT исходного запроса. – Quantastical

ответ

4

Попробуйте следующий код:

$users = array(); 

$result=mysql_query("SELECT id, submitted_by, COUNT(*) as cnt FROM reports GROUP BY submitted_by ORDER BY COUNT(*) DESC"); 

while($row=mysql_fetch_array($result)){ 
    $users[$row['submitted_by']] = $row['cnt']; 
} 
+0

И вам не нужно arsort() здесь, конечно. –

+0

Спасибо, именно то, что я искал. Может ли кто-нибудь дать мне представление о том, насколько быстрее это работает, чем мой исходный код, или как я буду тестировать это? – jovan

+0

Чтобы проверить это, вы можете создать большую базу данных с сотнями тысяч записей, иначе вы не увидите разницы. Затем выполните следующие действия: '$ start = microtime(); $ users = array(); $ result = mysql_query ("SELECT id, submitted_by, COUNT (*) as cnt FROM reports GROUP BY submitted_by ORDER BY COUNT (*) DESC"); while ($ row = mysql_fetch_array ($ result)) { $ users [$ row ['submitted_by']] = $ row ['cnt']; } $ end = microtime(); echo 'Время выполнения:'. ($ end - $ start). «микросекунды»; ' –

0
$users = array(); 

$result = mysql_query(" 
SELECT id,submitted_by, COUNT(*) as amount 
FROM reports 
GROUP BY submitted_by 
ORDER BY amount DESC 
"); 

while($row = mysql_fetch_array($result)) 
    $users[$row['submitted_by']] = $row['amount']; 

// arsort($users); 
0

Try:

$query = "SELECT id, submitted_by, COUNT(*) as numbers FROM reports GROUP BY submitted_by ORDER BY COUNT(*) DESC"; 

$result = mysql_query($query); 

echo "<table><tr><th>User</th><th>Reports</th></tr><tr>"; 

while($row = mysql_fetch_assoc($result)) { 

    echo "<td>$row[submitted_by]<td>"; 
    echo "<td>$row[numbers]<td>"; 

} 

echo "</tr></table>" 
Смежные вопросы