Сортировка по двум столбцам

almaz

Новичок
Помогите разобраться как сделать сортировку по нескольким столбцам в разные стороны (desc, asc).
Имеется запрос такого типа:
$query = mysqli_query($db, "set @n:=0");
$query = mysqli_query($db, "select *, @n:=@n+1 as `num` from `table1` inner JOIN `table2` on table1.users = table2.users ORDER BY `ref` DESC LIMIT ")

Мне нужно сделать чтобы параллельно еще имитируемый столбец num имел свою сортировку в виде возрастания (asc).
 

Фанат

oncle terrible
Команда форума
На самом деле в таких вопросах надо всегда спрашивать пример.
потому что представления нубов о сортировке бывают весьма экзотичными
не удивлюсь, что этот экземпляр хочет список, одновременно отсортированный по двум разным столбцам
так что надо обязательно вытрясать из них, как это должно выглядеть.
 

almaz

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

Вурдалак

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

Но нумерацию обычно делают на стороне PHP.
 

Фанат

oncle terrible
Команда форума
Вы правильно поняли суть вопроса: мне нужно чтобы один столбец был по убыванию, другой по возрастанию (как я и писал в шапке темы).
А вот вы неправильно поняли суть вопроса.
Он заключался в том, чтобы ты привел ПРИМЕР данных, отсортированных так, как тебе нужно. То есть чтобы одна и та же таблица одновременно была отсортирована по двум стобцам (спойлер: так не бывает)
 

WMix

герр M:)ller
Партнер клуба
PHP:
$query = mysqli_query($db, "set @n:=0");
$query = mysqli_query($db, "select *, @n:=@n+1 as `num` from (
  select * from `table1` inner JOIN `table2` on table1.users = table2.users ORDER BY `ref` DESC
) as t");
 

almaz

Новичок
Ты говоришь про «нумерацию», а не «сортировку». По части переменных код вроде бы выглядит верно, смотри ошибки.

Но нумерацию обычно делают на стороне PHP.
Вы меня наверное не совсем верно поняли. Нумерацию я сделал в запросе, т.к мне ее нужно в порядке возрастания сделать, вот я и посчитал что проще в запросе это реализовать. Насчет ошибок, то в том запросе что я скинул их и нет, я просто не знаю как реализовать сортировку двух столбцов в два разных направления.
А вот вы неправильно поняли суть вопроса.
Он заключался в том, чтобы ты привел ПРИМЕР данных, отсортированных так, как тебе нужно. То есть чтобы одна и та же таблица одновременно была отсортирована по двум стобцам (спойлер: так не бывает)
Ну например мне нужно чтобы при выхлопе запроса я имел следующее:
PHP:
num | users | ref
1 | Albert | 3
2 | Lina | 2
3 | Jack | 1
 

Фанат

oncle terrible
Команда форума
вот я и посчитал что проще в запросе это реализовать.
То есть вся эта мыльная опера с двумя запросами и непонятками на два дня по-твоему проще чем echo $i++ в пхп?
Оригинальная логика.
я просто не знаю как реализовать сортировку двух столбцов в два разных направления.
Если ты до сих пор не понял, в такой формулировке это невозможно и бессмысленно.
Отсортировать один и тот же список по двум критериям одновременно невозможно.
Тебе не сортировака нужна, а добавление цыферок к списку. То есть, как тебе раньше и сказали, тебе нужна нумерация. То есть отсортированный по ОДНОМУ критерию список, к которому сбоку приставлены цыферки, никак не привязанные к значениям. А ты пытаешься сначала добавить нумерацию, а потом сортировать в разные стороны.
 
Последнее редактирование:

almaz

Новичок
То есть вся эта мыльная опера с двумя запросами и непонятками на два дня по-твоему проще чем echo $i++ в пхп?
Оригинальная логика.
Я только изучаю php и не сообразил что можно так.
---
Попробовал. Ошибку выдает, вот мой код:
PHP:
$query = mysqli_query($db, "SELECT * FROM `table1` inner JOIN `table2` on table1.users = table2.users ORDER BY `ref` DESC LIMIT");

$id = 0;
$i = 1;

while($row = mysqli_fetch_assoc($query, $id < $i)){
$users = $row["users"];
$ref = $row["ref"];

echo "<tr><td>".$i++."</td><td>".$users."</td><td>".$ref."</td></tr>";
}
Ошибка следующая: Warning: mysqli_fetch_assoc() expects exactly 1 parameter, 2 given in C:\Program Files\VertrigoServ\www\testpage\index.php on line 100

Если ты до сих пор не понял, в такой формулировке это невозможно и бессмысленно.
Отсортировать один и тот же список по двум критериям одновременно невозможно.
Тебе не сортировака нужна, а добавление цыферок к списку. То есть, как тебе раньше и сказали, тебе нужна нумерация. То есть отсортированный по ОДНОМУ критерию список, к которому сбоку приставлены цыферки, никак не привязанные к значениям. А ты пытаешься сначала добавить нумерацию, а потом сортировать в разные стороны.
Благодарю, буду знать.
 
Последнее редактирование:

almaz

Новичок
Изменил:
while($row = mysqli_fetch_assoc($query, $id < $i)){
->
while($row = mysqli_fetch_assoc($query) & ($id < $i)) {
Нумерация есть, но нет других полей.
 

AnrDaemon

Продвинутый новичок
Оператор ассоциации имеет два приоритета, какой будет использован - зависит от построения фразы.
 

almaz

Новичок
Оператор ассоциации имеет два приоритета, какой будет использован - зависит от построения фразы.
Заменил на оператор and - вроде все отображается, перенес на идентичный код с пагинацией, там на каждой странице отображает статический отсчет до определенного числа, а не продолжается:(.
 

AnrDaemon

Продвинутый новичок
Заменили что на "and", простите?

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

almaz

Новичок
Заменили что на "and", простите?

Нас в школе, когда мы начинали тупить так же, как вы сейчас, просили расставить опущенные скобки в выражении.
Сдалайте это сейчас, не поленитесь. Надеюсь, тогда ваша ошибка станет яснее.
Было вот так:
while($row = mysqli_fetch_assoc($query) & ($id < $i)) {
стало вот так:
while($row = mysqli_fetch_assoc($query) and ($id < $i)) {
Таблицы теперь корректно выводит, но при пагинации счетчик не срабатывает на других страницах.
 

Фанат

oncle terrible
Команда форума
кто мешает на других страницах начинать не с нуля, а с актуального номера строки?
 
Сверху