SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 29.03.2017 15:35:56

racheev
Участник
Зарегистрирован: 29.03.2017
Сообщений: 7

Сортировка по кругу от значения первого поля

Всем привет. Помогите отсортировать по кругу игроков.


$dat = array('uid' => $user_id);
$st = $db->prepare("
    SELECT t0.id, user_id, first_name, photo
    FROM table_players t0
    JOIN users t1 ON t1.id = t0.user_id
    WHERE table_id = (
        SELECT table_id
        FROM table_players
        WHERE user_id = :uid
    )
-- сортировка от себя и по кругу            
    ORDER BY t0.user_id = :uid, t0.id    
"
);  
$st->execute($dat);
 

Не получается отсортировать как надо
надо что  бы каждый заходя видел себя первым а дальше от него по цепочке
например если зашел игрок с айди 1 то вывод
123456789
если зашел с айди 2 то вывод
234567891
и так далее

Но это если они по порядку зашли в игру так и получается... а если например первым зашел с айди 9 а вторым с айди 5 воттак 957863214
то соответственно вывод дожен быть если зайдет с айди 1
149578632

Отредактированно racheev (29.03.2017 15:38:38)

Неактивен

 

#2 29.03.2017 15:48:46

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Сортировка по кругу от значения первого поля

а где хранится порядок захождения игроков в игру?

Неактивен

 

#3 29.03.2017 16:50:40

racheev
Участник
Зарегистрирован: 29.03.2017
Сообщений: 7

Re: Сортировка по кругу от значения первого поля

Он формируется по id так как добавляется только в конец. Зашел стал последним в списке.. вышел будучи вторым зашел снова стал последним

Неактивен

 

#4 29.03.2017 16:59:07

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Сортировка по кругу от значения первого поля

всё равно не понятно,  в каком конкретно поле хранится тот список.
покажите пример с тестовыми данными в виде
create table ..
insert into ..
и какой должен быть результат на этих данных

Неактивен

 

#5 29.03.2017 17:12:26

racheev
Участник
Зарегистрирован: 29.03.2017
Сообщений: 7

Re: Сортировка по кругу от значения первого поля


CREATE TABLE `table_players` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `table_id` int(11) DEFAULT NULL,
  `user_id` int(11) DEFAULT NULL,
  `register` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique` (`table_id`,`user_id`),
  KEY `table_id` (`table_id`),
  KEY `user_id` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
 


CREATE TABLE `users` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `first_name` varchar(20) DEFAULT NULL,
  `photo` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
 


CREATE TABLE `tables` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL COMMENT 'название',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
 

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

Отредактированно racheev (29.03.2017 17:13:12)

Неактивен

 

#6 29.03.2017 17:23:53

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Сортировка по кругу от значения первого поля

order by if(user_id = :uid,0,1), id

Неактивен

 

#7 29.03.2017 17:59:21

racheev
Участник
Зарегистрирован: 29.03.2017
Сообщений: 7

Re: Сортировка по кругу от значения первого поля

неа. что-то не то



$dat = array('uid' => $user_id);
$st = $db->prepare("
    SELECT t0.id, user_id, first_name
    FROM table_players t0
    JOIN users t1 ON t1.id = t0.user_id
    WHERE table_id = (
        SELECT table_id
        FROM table_players
        WHERE user_id = :uid
    )
-- сортировка от себя и по кругу            
    ORDER BY if(user_id = :uid,0,1), id  
"
);  
$st->execute($dat);
$res = $st->fetchAll();
foreach ($res as $row) {
    echo $row['id'].' ';
}
 



неа. не выводит как надо..:-(( Я уже не знаю как быть...  Они первые три местами меняются, остальное как было..

Неактивен

 

#8 29.03.2017 18:12:09

racheev
Участник
Зарегистрирован: 29.03.2017
Сообщений: 7

Re: Сортировка по кругу от значения первого поля

Может не так объяснил?

Есть таблица

id my_id name

1    20    name1
2    45    name2
3    89    name3
4    34    name4
5    23    name5
6    98    name6
7    56    name7
8    49    name8
9    38    name9

необходимо отсортировать таблицу по id но что бы а выводе первым стоял my_id 89 id которого 3 а за ним по цепочке

3
4
5
6
7
8
9
1
2

и так же с любым другим. например my_id 56 id которого 7 и от него

7
8
9
1
2
3
4
5
6

Неактивен

 

#9 29.03.2017 18:39:54

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Сортировка по кругу от значения первого поля

ага, понял, тогда

mysql> select id from test order by if(id>=4,0,1), id;
+----+
| id |
+----+
|  4 |
|  5 |
|  6 |
|  7 |
|  8 |
|  9 |
|  1 |
|  2 |
|  3 |
+----+
9 rows in set (0.00 sec)

Неактивен

 

#10 29.03.2017 21:41:17

racheev
Участник
Зарегистрирован: 29.03.2017
Сообщений: 7

Re: Сортировка по кругу от значения первого поля

vasya написал:

ага, понял, тогда

mysql> select id from test order by if(id>=4,0,1), id;
+----+
| id |
+----+
|  4 |
|  5 |
|  6 |
|  7 |
|  8 |
|  9 |
|  1 |
|  2 |
|  3 |
+----+
9 rows in set (0.00 sec)

Нет, первым должен быть не id записи какой-то.. Так я знаю.. первым должен стоять my_id и отнего сортироваться по id. А тут сортировака от id 4 это просто. так и без if будет работать.

Отредактированно racheev (29.03.2017 21:41:50)

Неактивен

 

#11 29.03.2017 21:58:12

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Сортировка по кругу от значения первого поля

racheev написал:

Есть таблица

id my_id name

1    20    name1
2    45    name2
3    89    name3
4    34    name4
5    23    name5
6    98    name6
7    56    name7
8    49    name8
9    38    name9

необходимо отсортировать таблицу по id но что бы а выводе первым стоял my_id 89 id которого 3 а за ним по цепочке

3
4
5
6
7
8
9
1
2

mysql> select id from test order by if(id>=(select id from test where my_id = 89),0,1), id;
+------+
| id   |
+------+
|    3 |
|    4 |
|    5 |
|    6 |
|    7 |
|    8 |
|    9 |
|    1 |
|    2 |
+------+
9 rows in set (0.02 sec)

Неактивен

 

#12 29.03.2017 22:01:36

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Сортировка по кругу от значения первого поля

ещё вариант

mysql> select id from test, (select id x from test where my_id = 89) t order by if(id>=x,0,1), id;
+------+
| id   |
+------+
|    3 |
|    4 |
|    5 |
|    6 |
|    7 |
|    8 |
|    9 |
|    1 |
|    2 |
+------+
9 rows in set (0.02 sec)

Неактивен

 

#13 29.03.2017 23:13:10

racheev
Участник
Зарегистрирован: 29.03.2017
Сообщений: 7

Re: Сортировка по кругу от значения первого поля

Спасибо


ORDER BY if(t0.id>=(SELECT t2.id FROM table_players t2 WHERE t2.user_id = :uid),0,1), t0.id
 

Отработал как надо. Потом проверю на большем количестве данных.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson