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

  • Автор темы Автор темы almaz
  • Дата начала Дата начала

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).
 
На самом деле в таких вопросах надо всегда спрашивать пример.
потому что представления нубов о сортировке бывают весьма экзотичными
не удивлюсь, что этот экземпляр хочет список, одновременно отсортированный по двум разным столбцам
так что надо обязательно вытрясать из них, как это должно выглядеть.
 
На самом деле в таких вопросах надо всегда спрашивать пример.
потому что представления нубов о сортировке бывают весьма экзотичными
не удивлюсь, что этот экземпляр хочет список, одновременно отсортированный по двум разным столбцам
так что надо обязательно вытрясать из них, как это должно выглядеть.
Вы правильно поняли суть вопроса: мне нужно чтобы один столбец был по убыванию, другой по возрастанию (как я и писал в шапке темы).
 
Ты говоришь про «нумерацию», а не «сортировку». По части переменных код вроде бы выглядит верно, смотри ошибки.

Но нумерацию обычно делают на стороне PHP.
 
Вы правильно поняли суть вопроса: мне нужно чтобы один столбец был по убыванию, другой по возрастанию (как я и писал в шапке темы).
А вот вы неправильно поняли суть вопроса.
Он заключался в том, чтобы ты привел ПРИМЕР данных, отсортированных так, как тебе нужно. То есть чтобы одна и та же таблица одновременно была отсортирована по двум стобцам (спойлер: так не бывает)
 
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");
 
Ты говоришь про «нумерацию», а не «сортировку». По части переменных код вроде бы выглядит верно, смотри ошибки.

Но нумерацию обычно делают на стороне PHP.
Вы меня наверное не совсем верно поняли. Нумерацию я сделал в запросе, т.к мне ее нужно в порядке возрастания сделать, вот я и посчитал что проще в запросе это реализовать. Насчет ошибок, то в том запросе что я скинул их и нет, я просто не знаю как реализовать сортировку двух столбцов в два разных направления.
А вот вы неправильно поняли суть вопроса.
Он заключался в том, чтобы ты привел ПРИМЕР данных, отсортированных так, как тебе нужно. То есть чтобы одна и та же таблица одновременно была отсортирована по двум стобцам (спойлер: так не бывает)
Ну например мне нужно чтобы при выхлопе запроса я имел следующее:
PHP:
num | users | ref
1 | Albert | 3
2 | Lina | 2
3 | Jack | 1
 
вот я и посчитал что проще в запросе это реализовать.
То есть вся эта мыльная опера с двумя запросами и непонятками на два дня по-твоему проще чем echo $i++ в пхп?
Оригинальная логика.
я просто не знаю как реализовать сортировку двух столбцов в два разных направления.
Если ты до сих пор не понял, в такой формулировке это невозможно и бессмысленно.
Отсортировать один и тот же список по двум критериям одновременно невозможно.
Тебе не сортировака нужна, а добавление цыферок к списку. То есть, как тебе раньше и сказали, тебе нужна нумерация. То есть отсортированный по ОДНОМУ критерию список, к которому сбоку приставлены цыферки, никак не привязанные к значениям. А ты пытаешься сначала добавить нумерацию, а потом сортировать в разные стороны.
 
Последнее редактирование:
То есть вся эта мыльная опера с двумя запросами и непонятками на два дня по-твоему проще чем 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

Если ты до сих пор не понял, в такой формулировке это невозможно и бессмысленно.
Отсортировать один и тот же список по двум критериям одновременно невозможно.
Тебе не сортировака нужна, а добавление цыферок к списку. То есть, как тебе раньше и сказали, тебе нужна нумерация. То есть отсортированный по ОДНОМУ критерию список, к которому сбоку приставлены цыферки, никак не привязанные к значениям. А ты пытаешься сначала добавить нумерацию, а потом сортировать в разные стороны.
Благодарю, буду знать.
 
Последнее редактирование:
Изменил:
while($row = mysqli_fetch_assoc($query, $id < $i)){
->
while($row = mysqli_fetch_assoc($query) & ($id < $i)) {
Нумерация есть, но нет других полей.
 
Оператор ассоциации имеет два приоритета, какой будет использован - зависит от построения фразы.
 
Оператор ассоциации имеет два приоритета, какой будет использован - зависит от построения фразы.
Заменил на оператор and - вроде все отображается, перенес на идентичный код с пагинацией, там на каждой странице отображает статический отсчет до определенного числа, а не продолжается:(.
 
Заменили что на "and", простите?

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

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