2013-10-11 4 views
4

У меня есть две таблицы. Uploaders - id, name, icon, views Видео - id, uploader, video, viewsSQL ORDER BY Idea

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

как это сделать? Херес код, что я до сих пор ...

//Retrieve data from the database 
$fkbar = mysql_query("SELECT * FROM freaks"); 
while($fkrow = mysql_fetch_array($fkbar)) 

//Echo Theme Template on pages 
{ 
    $frkid = $fkrow['id']; 
    $viewq = mysql_query("SELECT SUM(views) AS vw FROM videos WHERE ref1='{$frkid}' OR ref2='{$frkid}' OR ref3='{$frkid}'"); 
    while($viewcnt = mysql_fetch_array($viewq)) 
    {  

     $viewcount = $viewcnt['vw']; 

      echo "<div class='diva' id='{$viewcount}'>"; 
      echo "<div class='inner-diva'><a href='/mobile/freaks/?i={$fkrow['id']}'>"; 
      echo "<img id='{$fkrow['id']}' class='dvBarIco' src='/assets/ico/{$fkrow['icon']}' height='80px'></a></div>"; 
      echo "</div>"; 
    } 
} 
+1

Просто, чтобы вы знали, вы потенциально широко открыты для SQL-инъекций. Вы должны использовать параметризованные запросы. –

+0

Спасибо. Я просто базовый разработчик и сезонный дизайнер, но после этого этапа остальная часть команды разработчиков должна обеспечить код моей серверной части для недостатков и еще чего-то. –

+0

Хе-хе ... «должно быть» .... Никто никогда не имеет столько времени, сколько они думают. Вы обязаны сделать это как для себя, так и для своего клиента (чтобы защитить свои данные), чтобы изучить это. При выполнении параметризованных запросов не _hard_, поиск всех экземпляров и «фиксация» их потребуют времени. Сделайте себя более ценным для компании, которая наняла вас - узнайте, какую библиотеку они используют, и реализуйте свои запросы, используя ее. –

ответ

1

Просто добавьте ORDER BY положение с помощью агрегата:

ORDER BY SUM(views) DESC 

От вашего комментария, вы можете использовать подзапрос в первой сделать заказ:

SELECT * 
FROM freaks f 
ORDER BY (SELECT SUM(views) FROM videos WHERE ref1=f.id OR ref2=f.id OR ref3=f.id) DESC 

Вы также можете сделать это с помощью объединения, но OR может сделать вещи сложными:

SELECT f.*, COALESCE(v.views, 0) total_views 
FROM freaks f 
LEFT OUTER JOIN (
    SELECT SUM(views) views, id 
    FROM (
     SELECT views, ref1 AS id 
     FROM videos 
     UNION ALL 
     SELECT views, ref2 AS id 
     FROM videos 
     UNION ALL 
     SELECT views, ref3 AS id 
     FROM videos 
    ) x 
    GROUP BY id 
) v ON f.id = v.id 
ORDER BY total_views DESC 
+0

Если вы видите последнюю группу эхо-заявлений, они извлекают информацию из первого запроса. но первый запрос не упорядочен по сумме представлений из другой таблицы; в основном я бы хотел отсортировать первый freaks.table с суммой (просмотров) со второго видео. Таблица –

+0

спасибо. подзапрос работал безупречно! Я узнаю что-то новое каждый раз, когда я задаю вопрос. Я даже не знал о подзапросах. –

1

Попробуйте использовать подзаголовок, чтобы получить сумму, которая объединит оба ваших запроса и даст вам возможность упорядочивать по обеим таблицам, а не во втором запросе каждый раз.

$fkbar = mysql_query(
"SELECT 
    (SELECT SUM(views) AS vw FROM videos WHERE videos.ref1=freaks.id OR videos.ref2=freaks.id OR videos.ref3=freaks.id) as total_views, 
* FROM freaks ORDER BY total_views DESC");