ORDER BY в масива, а не в SQL заявката

Lumix

Registered
Колеги, има ли начин сортирането на заявката да стане извън нея и ако има как ще стане номера? Тоест примерно имаме една база данни, от която избираме две таблици:
i
Таблица потребители -> 1
Таблица торенти -> 2

Към таблица 1 се поддава заявка да селектира потребителите чиито клас е 2 или 3 и чийто подклас е 1 или 2. До тук добре. Следва да извадим последния качен торент на всеки един от тези потребители. Така до тук селектите са ок, но сега идва трудното обаче сега потребителите трябва да се сортират по последния им качен торент. Ако някой има идея как ще стане кода ще съм много благодарен.

Редовете, които трябва да се селектират са:
От таблица users: id, username, uploaded, downloaded, warned
От torrents: added WHERE owner = $userid ORDER BY added DESC LIMIT 1

Предварително благодаря.
 
имаш извличане от 2 таба, ако беше от една щях да си ги сортирам още в селекта
 
Обединих ги. Сървъра е прекалено тежък и бави нещо... за това питам дали има начин да се сортират извън SQL-а
 
Щом ти бави при MySql заявка, сигурно ще ти бави и при PHP скрипт, защото при всички случаи ще трябва да обходи 2-та масива с резултати за да ги сортира.
 
А някой, някаква идея защо на тестовия сървър ми изпълнява SQL заявката за 0.06 секунди, а на основната ми машина на 300 секунди все още не е успяло да зареди разликата между двете машини е, че основния сървър е 16 пъти по-голям в следствие, на което ще му отнеме повече време но над 5 минути е доста прекалено:
Тестовия ми сървър е с SQL 5.0.77
Основния ми сървър е с SQL 5.1

Eто и SQL кода:

[sql]SELECT distinct(users.id) AS userid, users.username AS username, users.uploaded AS upload, users.downloaded AS download, users.warned AS warned, users.class, users.subclass, torrents.id AS tid, UNIX_TIMESTAMP(torrents.added) AS added, torrents.owner AS owner FROM users JOIN torrents ON torrents.owner = users.id WHERE users.class = '2' OR users.class = '3' AND (users.subclass = '1' OR users.subclass = '2') and torrents.added=(SELECT MAX(torrents.added) FROM torrents WHERE torrents.owner=users.id) GROUP BY users.id ORDER BY UNIX_TIMESTAMP(torrents.added) DESC;[/sql]
 
А някога да си се замислял за този вариант :
PHP:
$sql=mysql_query("SELECT distinct(torrents.owner) as uid, MAX(torrents.added) as added,torrents.id as tid,users.class,users.subclass FROM torrents
    JOIN users ON torrents.owner=users.id
    WHERE users.class = '2' OR users.class = '3' AND (users.subclass = '1' OR users.subclass = '2')");
while($row=mysql_fetch_assoc($sql)){
    $user_id=$row[uid];
    $tid[$user_id]=$row[tid];
    $added[$user_id]=$row[added];
}
?
 
Няма да мине по този начин.

Заявката горе работи - въпроса ми е защо бави толкова?
 
Защото имаш JOIN и вложен SELECT в една и съща заявка. Просто няма как да очакваш да се изпълни бързо. Иначе съм 100% сигурен, че заявката, която ти дадох ще се изпълни по-бързо и ще изкара същата информация като другата заявка.
 
StormBreaker каза:
Сложи един индекс на колоните, които ползваш в WHERE и много по-бързо ще работи.
Безсмислено е да слагаш индекс в колона, която ти е право на достъп или time :)
 
ivo_pi4a каза:
StormBreaker каза:
Сложи един индекс на колоните, които ползваш в WHERE и много по-бързо ще работи.
Безсмислено е да слагаш индекс в колона, която ти е право на достъп или time :)

Безсмислено е да ровиш всеки ред от таблицата всеки път при положение, че ще е 100 пъти по-бързо веднага да селектираш това, което ти трябва. Без да търсиш като луд ред по ред.
 
Прав е @StormBreaker два пъти по-добре е ако примерно имаш поле: torrent_id и имаш таблица torrents когато вземаш id-то от torrents и го сравняваш с torrent_id да се използва INDEX.
А иначе в полета които се съдържа 1,0 за проверка примерно дали е одобрено или не, не мисля че има смисъл от INDEX. :idea:
 
Ev0luti0N каза:
Прав е @StormBreaker два пъти по-добре е ако примерно имаш поле: torrent_id и имаш таблица torrents когато вземаш id-то от torrents и го сравняваш с torrent_id да се използва INDEX.
А иначе в полета които се съдържа 1,0 за проверка примерно дали е одобрено или не, не мисля че има смисъл от INDEX. :idea:
Доколкото разбрах идеята му е да вземе ид на торента на последния качен от потребителя торент, като това се прави с 1 заявка за всички клиенти :) Заради това ви казах, че е безсмислено да се индексира време и клас на потребител. Вижте заявката, която той си иска и после ми кажете дали не се бави от присъединяването на друга таблица и слагането на вложен SELECT в WHERE клаузата :)
 
StormBreaker каза:
Говоря за Mysql INDEX. Има гугъл ако някой не знае какво е
И аз за него говоря, доколкото знам се поставя на полета които присвояват id-тата от други таблици. :?:
 
Колеги, имам индекси на id-тата и на users и на torrents. На полетата class да слагам ли защото смятам, че ще стане лютеница?
 
Просто сложи и виж разликата. Индексите на id си ги има винаги. А за колони дето се свързват с друга таблица също е добре. Но това не значи, че САМО там може. Просто пробвай.
 
StormBreaker каза:
Просто сложи и виж разликата. Индексите на id си ги има винаги. А за колони дето се свързват с друга таблица също е добре. Но това не значи, че САМО там може. Просто пробвай.
ID-тата не трябва ли да са PRIMARY :idea:
 

Back
Горе